Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码优先和数据加载_C#_Entity Framework_Database Design - Fatal编程技术网

C# 代码优先和数据加载

C# 代码优先和数据加载,c#,entity-framework,database-design,C#,Entity Framework,Database Design,我应该在EF代码优先还是模型优先之间做出选择 我不确定什么是提高开发效率的最佳解决方案,什么是IoC框架集成的最简单解决方案 我尝试先从代码开始,但无法将导航属性用作IQueryable。声明导航属性时,我使用ICollection,如: public class Invoice { ... public ICollection<LineItem> LineItems { get; set; } ... } 加载发票时,由于延迟加载,我的LineItems集合为空 但是,当我

我应该在EF代码优先还是模型优先之间做出选择

我不确定什么是提高开发效率的最佳解决方案,什么是IoC框架集成的最简单解决方案

我尝试先从代码开始,但无法将导航属性用作IQueryable。声明导航属性时,我使用ICollection,如:

public class Invoice {
...
   public ICollection<LineItem> LineItems { get; set; }
...
}
加载发票时,由于延迟加载,我的LineItems集合为空

但是,当我从数据库加载此属性时,在将此集合用作IQueryable之前,我是否会从数据库加载此发票的所有行项目

我的想法是使用IQueryable尽可能减少数据库加载,以提高性能

我做错了什么?最佳做法是什么


当我首先使用数据库时,我可以使用我的导航属性作为IQueryable开箱即用,而无需编写任何代理类或包装


谢谢

您需要将所有实体属性虚拟化。这允许EF为您的实体生成一个代理类,以便您可以通过它进行查询

public class Invoice {
     public virtual ICollection<LineItem> LineItems { get; set; }
}
公共类发票{
公共虚拟ICollection行项目{get;set;}
}

需要
虚拟
关键字才能使懒散加载工作。

我的导航属性为IQueryable”-这并不总是一个优点。为什么?我可以对我的集合属性应用一个查询来构建SQL查询,以免数据库受到干扰。例如,lazyloading正在做您想做的事情,延迟对数据库的实际查询,直到您实际访问记录/实体。但在某些情况下,您将不得不进行延迟加载或关闭lazyloading/proxy,但情况会有所不同;并设置我的导航。属性作为虚拟属性。但它不影响导航属性的加载。发票行项目与发票一起加载。默认情况下,它们不是空的。默认情况下,EF4.1的Lazyloading处于启用状态。如果您有行项目
虚拟
,我想您需要在其他地方查找问题。这个,这个应该给你一个想法。
public class Invoice {
     public virtual ICollection<LineItem> LineItems { get; set; }
}