Entity framework 在.NET Core 3实体框架下定义导航属性的正确方法
我感到非常困惑,因为我发现了几个不同版本的.NETCore3下如何在EntityFramework中正确定义导航属性。我发现这样的版本:Entity framework 在.NET Core 3实体框架下定义导航属性的正确方法,entity-framework,.net-core,Entity Framework,.net Core,我感到非常困惑,因为我发现了几个不同版本的.NETCore3下如何在EntityFramework中正确定义导航属性。我发现这样的版本: public List<MyObj> MyObjects {set; get;} public List<MyObj> MyObjects {get;} = new List<MyObj>(); public virtual List<MyObj> MyObjects {set; get;} public vir
public List<MyObj> MyObjects {set; get;}
public List<MyObj> MyObjects {get;} = new List<MyObj>();
public virtual List<MyObj> MyObjects {set; get;}
public virtual List<MyObj> MyObjects {get;} = new List<MyObj>();
public ICollection<MyObj> MyObjects {set; get;}
public virtual ICollection<MyObj> MyObjects {set; get;}
公共列表MyObjects{set;get;}
公共列表MyObjects{get;}=new List();
公共虚拟列表MyObjects{set;get;}
公共虚拟列表MyObjects{get;}=new List();
公共ICollection MyObjects{set;get;}
公共虚拟ICollection MyObjects{set;get;}
还有一些。但哪一个版本最合适/最新/正确?根据,第一个应该是正确的,但是我也发现了一些有不同文章的老文章。在你的例子中有3个明显的不同
virtual
-您需要将您的属性标记为virtual以允许延迟加载。这是一个设计决策,不依赖于版本(EF/EF核心)List
vsICollection
-您想使用的“收藏”类型的个人选择List
实现ICollection
。您甚至可以使用IEnumerable
virtual
(自己尽量避免),并使用对代码有意义的任何类型。不过,我不喜欢自动初始化我的收藏
更新带有属性初始化器的Setter实际上是一个getter更新的答案除了第一个类型,我从未使用过其他类型。是列表(不是数组,不是集合)的最简单也是最好的声明@AlleXyS我读到,您应该将它们标记为虚拟以允许延迟加载。我知道,在EF6中,使用DB-first方法是必须的。但在新的.NET核心世界中,情况仍然如此吗?很抱歉我提出了一个愚蠢的问题,但这是我的第一个代码优先项目。关于setter:微软的官方教程实际上就是这么说的:你会说,我不应该这么做吗?@AndréReichert那个例子使用的是getter,而不是setter。哦,对不起。我在上面手写的代码是错误的。我修好了。那么您会说,编写类似于
公共列表MyObjects{get;}=new List()代码>有意义吗?@AndréReichet肯定会有所不同,我已经相应地更新了我的答案,非常感谢。我可以问一下,你为什么不喜欢懒洋洋的装载?