【发布时间】:2013-06-03 09:24:29
【问题描述】:
我的数据库中有两个表:Masters 和 Details。
这些表通过外键约束一对多关联,其中Masters 是主键表,Details 是外键表。
我想在我的模型中为Masters 表中的实体使用继承:
abstract class Master
{
public int Id { get; set; }
}
class Master_1 : Master
{
// other properties
}
class Master_2: Master
{
// other properties
}
对于来自Details 表的实体:
abstract class Detail
{
public int Id { get; set; }
}
class Detail_1 : Detail
{
// other properties
}
class Detail_2: Detail
{
// other properties
}
class Detail_3: Detail
{
// other properties
}
但是外键呢?
从概念上讲,Master_1 应仅包含 Detail_1 详细信息,Master_2 应包含 Detail_2 或 Detail_3 详细信息。
如果我要从实体框架中抽象出来,我会为 Detail_2 和 Detail_3 添加中间基类:
abstract class Detail_2_Or_3 : Detail {}
class Detail_2 : Detail_2_Or_3 {}
class Detail_3 : Detail_2_Or_3 {}
让我的Master 通用:
abstract class Master<TDetail>
where TDetail : Detail
{
public int Id { get; set; }
public Collection<TDetail> Details { get; private set; }
}
class Master_1 : Master<Detail_1> {}
class Master_2 : Master<Detail_2_Or_3> {}
但是如何使用实体框架来实现呢?我不喜欢这个解决方案,当Master 有一个Details 的集合时,因为这不能提供编译时保证。
我正在寻找在Master 和Detail 层次结构上没有额外层的方法。
有什么想法吗?
【问题讨论】:
-
这是一本有趣的读物,希望能为您提供深思...weblogs.asp.net/manavi/archive/2011/01/03/…
-
@PaulZahra:我认为 TPC 继承的描述没有帮助。可能是我遗漏了什么?
-
你看TPT和TPH了吗?
-
问题不在于选择继承模型(在这种特殊情况下将是 TPT)。问题是关于如何配置关系,因此它将提供编译时安全性。
-
对于抽象类,关联必须仅引用其子类之一的实例。
标签: c# entity-framework ef-code-first