【问题标题】:EntityFramework - Saving Aggregates Roots Which Contain EntitiesEntityFramework - 保存包含实体的聚合根
【发布时间】:2016-09-30 00:01:15
【问题描述】:

我正在为我的 C# 应用程序使用实体框架。

我即将完全实现它,但对流畅的 API 有点困惑。

我的课程概览(简体)

class Customer : IEntity {
    public Id { get; set; }
    public Name Name { get; set; };

    public Customer() {}

    public Customer( Name name ){
        this.name = name;
    }
}


class Name {
    public String Title;
    public String Forename;
    public String Surname;

    public Name(){}

    public Name( String Title, String Forename, String Surname ){
        // assign values
    }
}

使用实体框架的保存似乎工作正常;至少没有任何例外。 但是,当我尝试让所有客户使用 DbContext.getAll() 时,它会在尝试将 customer.Name.Forename 打印到输出窗口时抛出 NullReferenceException。我可以看到 customer.Name 为 null - 这显然是导致该异常的原因。

为什么名称(以及所有其他类似属性)为空?我该如何解决这个问题?

注意: 我在 Customer 模型中有一个日期,并且在我将以下内容添加到我的 DbContext 实现后,它会正确填充...

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
}

我想我需要在此处添加一些内容才能正确映射名称。我只是不确定如何去做。

提前致谢。

【问题讨论】:

  • 在提取实体后多久您尝试访问customer.Name.Forename?如果它超出了 DbContext 的范围,如果您使用延迟加载,您将遇到此问题。
  • 我在我的 DbContext 的构造函数中使用this.Configuration.LazyLoadingEnabled = false; 禁用了延迟加载,所以这不是问题。那里有客户,否则它不会进行任何迭代。此外,我在模型中的日期字段已填充
  • 这与 DDD 或聚合和实体无关。您希望将子实体与根类一起加载。 你映射了类之间的关系吗?您的映射仅显示不相关的属性类型规范。另外,不要禁用延迟加载,而是使用Include() 方法。
  • Title、Forename 和 Surname 应该在数据库的 Customer 表中吗?如果您希望在其他地方重用它,请考虑将它们直接放在您的客户类中或为 Name 制作一个复杂类型
  • @PanagiotisKanavos - 我明白,从技术上讲,这与 DDD 无关(否则会有我需要排序的耦合)。我已经使用这个例子提出了这个问题,以更好地突出我的情况。

标签: c# entity-framework visual-studio ddd-repositories


【解决方案1】:

我在Name 类上方添加了[ComplexType],它现在可以工作了。

为了清楚起见:

[ComplexType]
class Name {
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2016-11-05
    相关资源
    最近更新 更多