Entity FrameWork知识1

参考 https://blog.csdn.net/u010028869/column/info/entityframework

 

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

实体属性后面或方法参数后面加问号 代表该参数可为空

public DateTime? CreateTime{ set { _createtime = value; } get { return _createtime; }}

public GenericModel GetSites(DateTime? timeFrom){

try
{
GenericModel model = GenericModel.Success();
model.Data = manager.GetSitesForUser(identity.User.UserID, timeFrom);
return model;
}
catch{}

throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.InternalServerError, GenericModel.InternalError()));

}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

ORM 实体对象关系中  属性前加virtual

 

 [Table("order")]

public class Order
{

[Column("id")]
public int Id { get; set; }
public string Customer { get; set; }
public System.DateTime OrderDate { get; set; }

public virtual List<OrderDetail> OrderDetails { get; set; }
}

 

public partial class OrderDetail
{
public int Id { get; set; }
public string Product { get; set; }
public string UnitPrice { get; set; }
public int OrderId { get; set; }

public virtual Order Order { get; set; }
}


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

Entity Framework 是微软以 ADO.NET 为基础所发展出来的ORM 解决方案,EF4.1之前EF支持“Database First”和“Model First”,从EF4.1开始EF开始支持支持“Code 

1.Database First模式顾名思义:“数据库优先”,使用这种模式的前提是已经拥有数据库,我们可以使用EF设计工具由数据库生成数据模型类。

2.ModelFirst我们称之为“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,使用ModelFirst的前提是,应用程序还没有创建相应的数据库,咱们可以用Visual Studio通过设计系统相关的数据模型来生成数据库结构。

3.Code First模式我们称之为“代码优先”模式,从某种角度来看,其实“Code First”和“Model First”区别并不是太明显,只是它不借助于实体数据模型设计器,而是直接通过编码方式设计实体模型(这也是为什么最开始“Code First”被叫做“Code Only”的原因)。但是对于EF它的处理过程有所差别,例如我们使用Code First就不再需要EDM文件,所有的映射通过“数据注释”和“fluent API”进行映射和配置。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

EF加载数据的方式:有预加载、延迟加载、显式加载、按需加载。不同的加载方式都有不同的适用情况,我们不能笼统地下决定说哪种方式好哪种方式不好。但有一点是需要遵循的,那就是如何提高数据加载的效率。

1 延迟加载(Lazy Loading)

延迟加载又叫惰性加载(Lazy Loading)(用的时候加载):即在需要或者使用的时候加载数据。默认情况下,EF会使用延迟加载方式加载数据,即数据库上下文的属性:Configuration.LazyLoadingEnabled = true;  如果将数据库上下文的属性设置为 false 的话(Configuration.LazyLoadingEnabled = false; )将不会查询到从表的数据,只会执行一次查询。

2 预加载(Eager Loading) 

你想让所有数据一次性全部加载到内存中,那么你需要使用.Include(Entity)方法。

即程序只通过一次查询便获取到了所有需要的数据。它也可以减少程序与数据库的交互次数。不过仍然有缺点,那就是如果数据量较大,一次性将所有数据载入内存往往并不是最明智的选择。.Include(Entity)方法允许级联使用,你可以预先加载具有多层级结构的数据。

using (var dbcontext= new ModelFirstDemoEntities())
{
#region 贪婪加载: 一次查询加载全部数据
var q = from t in dbcontext.Customer.Include("Order")
select t;

foreach (var cus in q)
{
Console.WriteLine("Teacher : {0}", cus.Id);
Console.WriteLine("Respective Courses...");
foreach (var order in cus.Order)
{
Console.WriteLine("Course name : {0}", order.OrderContent);
}
Console.WriteLine();
}
#endregion

}

级联使用,你可以预先加载具有多层级结构的数据

var orders = from o in context.Orders.Include("OrderDetails").Include("Businesses") where o.CustomerName == "Mac" select o;

比较两种加载方式

预加载:

• 减少数据访问的延迟,在一次数据库的访问中返回所有的数据。
• 减少与数据库的交互次数

延迟加载:

• 非常宽容,因为只在需要的时候加载数据,不需要预先计划
• 可能会因为数据访问的延迟而降低性能,考虑到每访问父实体的子实体时,就需要访问数据库。

 

两种加载数据的方式没有什么好坏之分,只是从不同的角度出发适用于不同情况环境。延迟加载更具有灵活性,类似于分治法,每次加载少量数据,分多次加载。但是当主表数据数量过多时,会频繁访问数据库降低性能。预加载只要访问一次数据库就可以拿到全部的数据,放到内存中。但是当数据量很多,或者实体级联关系复杂时要特别注意性能了;实体关系复杂时EF自动生成的sql语句可能会非常复杂,这点也要特别注意。

3显式加载(Explicit Loading)

显式加载和延迟加载非常类似,不同的是显式加载要手动关闭EF的延迟加载属性,通过代码ctx.Configuration.LazyLoadingEnabled = false;来完成。

using (var dbcontext= new ModelFirstDemoEntities())
{
dbcontext.Configuration.LazyLoadingEnabled = false;
#region 显式加载:查询部分列数据,前提关闭 懒加载
//查询表中部分列的数据
var items = from c in dbcontext.Customer
select c;
foreach (var item in items)
{
//条件判断,只加载满足条件的数据,减少访问数据库的次数
if (item.Id < 5)
{
dbcontext.Entry(item).Collection(c => c.Order).Load();
Console.WriteLine(item.CusName);
}

foreach (var order in item.Order)
{
Console.WriteLine("Course name : {0}", order.OrderContent);
}
}
#endregion
}

通过在SQL Server Profiler中的跟踪记录可以看到一共执行了4次对Order表的查询。显式加载的意义就在于我们可以通过添加判断条件,对数据加载方式进行控制,从而有效地减少程序与数据库交互的次数。大多数情况下,我们从数据库获取到的数据并不都是需要的,如果每次只有很少一部分数据有用,那么我们为什么不过滤掉那些无用的数据从而尽量较少数据交互的次数呢?

 

4按需加载

其实EF并不存在按需加载的概念,但是这种方式很值得说一说,在加载数据的时候并不是需要所有的属性值,可能只需要一个Id,Name值。所以我们可以对要查询的实体进行一下筛选,只加载自己需要的某些列,避免加载大量的垃圾数据。在这里按需加载的概念只是加载需要的列。可能会与前端开发中 的概念“按需加载”有所冲突。

#region 按需加载:查询部分列数据
//查询表中部分列的数据
var items = from c in dbcontext.Customer
where c.Id < 10
select new { Id = c.Id, CName = c.CusName, OrderCount = c.Order.Count() };
foreach (var item in items)
{
Console.WriteLine(item.CName);
}
#endregion

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 

posted @ 2018-12-03 12:00  .L  阅读(151)  评论(0)    收藏  举报