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
Entity framework 在.NET Core 3实体框架下定义导航属性的正确方法_Entity Framework_.net Core - Fatal编程技术网

Entity framework 在.NET Core 3实体框架下定义导航属性的正确方法

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

我感到非常困惑,因为我发现了几个不同版本的.NETCore3下如何在EntityFramework中正确定义导航属性。我发现这样的版本:

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
    vs
    ICollection
    -您想使用的“收藏”类型的个人选择
    List
    实现
    ICollection
    。您甚至可以使用
    IEnumerable
  • 带有属性初始值设定项的Getter-这强制非空集合。我不喜欢使用此模式,因为它意味着null表示我在不使用延迟加载时没有加载集合。否则我就不知道我是取回了收藏还是它只是空的
  • 这些模式中的每一种都是设计选择,由您来决定什么对您的应用程序/编码风格有意义

    TL:DR如果要使用延迟加载,请使用
    virtual
    (自己尽量避免),并使用对代码有意义的任何类型。不过,我不喜欢自动初始化我的收藏


    更新带有属性初始化器的Setter实际上是一个getter更新的答案

    除了第一个类型,我从未使用过其他类型。是列表(不是数组,不是集合)的最简单也是最好的声明@AlleXyS我读到,您应该将它们标记为虚拟以允许延迟加载。我知道,在EF6中,使用DB-first方法是必须的。但在新的.NET核心世界中,情况仍然如此吗?很抱歉我提出了一个愚蠢的问题,但这是我的第一个代码优先项目。关于setter:微软的官方教程实际上就是这么说的:你会说,我不应该这么做吗?@AndréReichert那个例子使用的是getter,而不是setter。哦,对不起。我在上面手写的代码是错误的。我修好了。那么您会说,编写类似于
    公共列表MyObjects{get;}=new List()有意义吗?@AndréReichet肯定会有所不同,我已经相应地更新了我的答案,非常感谢。我可以问一下,你为什么不喜欢懒洋洋的装载?