【发布时间】: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