【问题标题】:Correct way to define a navigation property under .NET Core 3 Entity Framework在 .NET Core 3 Entity Framework 下定义导航属性的正确方法
【发布时间】:2020-03-02 22:49:58
【问题描述】:

我很困惑,因为我发现了几个不同版本的如何在 .NET Core 3 下的 Entity Framework 中正确定义导航属性。我找到了这样的版本:

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;}

还有一些。但是哪一个是最合适/最新/正确的版本?按照Microsoft's documentation的说法,第一个应该是对的,但我也找到了不同写法的老文章。

【问题讨论】:

  • 我从来没有使用过第一种以外的其他类型。是列表最简单最好的声明(不是数组,不是集合)
  • @AlleXyS 我读到,您应该将它们标记为虚拟以允许延迟加载。我知道,这在 EF6 中使用 DB 优先方法是必须的。但在新的 .NET Core 世界中仍然如此吗?抱歉我的愚蠢问题,但这是我的第一个代码优先项目。

标签: entity-framework .net-core


【解决方案1】:

您的示例中有 3 个明显不同

  1. virtual - 您需要将您的属性标记为虚拟以允许延迟加载。这是一个设计决策,不依赖于版本(EF/EF Core)。
  2. List&lt;&gt; vs ICollection - 个人选择你想使用什么类型的“集合”List&lt;T&gt;实现ICollection&lt;T&gt;。你甚至可以使用IEnumerable&lt;T&gt;
  3. 带有属性初始化器的 Getter - 这强制非空集合。我更喜欢不使用这种模式,因为它意味着 null 意味着我在不使用延迟加载时还没有加载集合。否则我将不知道我是否已检索到该集合或者它只是空的。

这些模式中的每一个都是设计选择,由您决定什么对您的应用/编码风格有意义。

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

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

【讨论】:

  • 关于二传手:微软官方教程中实际上是这样说的:docs.microsoft.com/en-us/ef/core/get-started/… 你会说我不应该这样做吗?
  • @AndréReichelt 该示例使用 getter,而不是 setter。
  • 哦,对不起。我上面的手写代码是错误的。我修好了它。所以你会说,写像public List&lt;MyObj&gt; MyObjects {get;} = new List&lt;MyObj&gt;(); 这样的东西有意义吗?
  • @AndréReichelt 肯定会有所作为,我已经相应地更新了我的答案
  • 非常感谢。请问,你为什么不喜欢延迟加载?
猜你喜欢
  • 2018-04-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多