【问题标题】:Initializing a POCO Entity using a constructor使用构造函数初始化 POCO 实体
【发布时间】:2011-08-11 14:44:58
【问题描述】:

我有 2 个 POCO 课程:

(摘录):

public class Note
{
    public int Id { get; set; }
    public int CategoryId { get; set; }

    public virtual Category Category { get; set; }

    public Note(int categoryId)
    {
    }
}

public class Category
{
    public int Id { get; set; }

    public virtual ICollection<Note> Notes { get; set; }
}

这是一个1:n 关系,Note 有一个Category,每个类别都有很多Notes

我希望每个实体上都有一个构造函数来初始化所有属性(这比使用Object Initializer 更好)。

但如果我在 Note 上使用构造函数,我不知道如何将 Note 与其类别“绑定”。

如果我将CategoryId 传递给构造函数,类别将为null。如果我通过 Category 并手动分配 ID,Category 将是 null

那么,有没有一种方法可以让我使用构造函数来初始化实体,并同时获取链接到我的笔记的类别?

编辑

如您所见,我在 Note 类上有一个构造函数。我的问题是:我必须通过categoryId,整个Category 项目吗? (如果我将某些东西分配给虚拟属性,ReSharper 会哭)。

如果我将categoryId 传递给对象,实体将不会被链接。

【问题讨论】:

  • 你也应该展示你的代码,因为它不清楚你在做什么/期待什么
  • 已更新。是一件很简单的事情,只需要一个自定义构造函数来构建我的 Note 类并链接类别。

标签: c# entity-framework constructor poco


【解决方案1】:

你努力的意义何在?它主要是无用的,因为:

  • 您仍然必须提供无参数构造函数,因为 EF 需要它
  • EF 永远不会使用您的自定义构造函数
  • 如果要使用延迟加载EF需要导航属性virtual
  • 从构造函数分配虚拟属性是错误的,因为虚拟代码可以在派生类中被覆盖,并且您的构造函数可以触发尚未初始化的派生类中的逻辑执行(父构造函数首先执行)。在您的确切情况下这不是问题,但任何人都可以派生您的类并覆盖 Category 属性,这将成为一个问题。这完全是错误的做法。

初始化器可以解决你所有的问题,那么为什么要使用参数化的构造函数呢?你应该定义你的优先级。如果延迟加载对您来说是必须的,请放弃参数化构造函数或接受 Category 必须在构造函数之外配置的事实。如果不需要延迟加载,只需从 Category 中删除 virtual 关键字并根据需要使用参数化构造函数。

【讨论】:

  • 你说得对,我是在尝试使用构造函数时发现的。
【解决方案2】:

一旦实体附加并保存到上下文或由上下文返回,虚拟属性就会被填充。

如果您真的希望 Category 不为 null,则应设置 id(或导航属性)并将更改应用于上下文。

【讨论】:

  • 我读过它,但我不知道它如何适用于我的问题。它说明了如何导航到相关实体,但它们在我的软件上是空的。
  • 您可以直接设置导航属性并将它们作为条目添加到您的dbcontext中,而不是设置id来建立关系
  • 谢谢,但我认为使用对象初始化器更容易:P
【解决方案3】:

如果它们是 POCO,请将 CategoryId 公开为只读属性:

public class Note
{
    public int Id { get; set; }
    public int? CategoryId { get { return Category == null ? (int?)null : Category.Id; } }
    public virtual Category Category { get; set; }
}

【讨论】:

  • 这是为什么呢?只是为了使用带参数的构造函数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多