【发布时间】:2012-09-13 13:37:31
【问题描述】:
首先对 EF 代码进行有趣的继承。您认为有一种映射策略可以实现这一目标吗?
所以我有一个名为“Animal”的基本抽象类和来自 Animal 类的 3 个派生类:Fish、Dog 和 UnknownAnimal。 Animal 类有自己的 SQL 表,Fish 和 Dog 分别有 SQL 表 Fish 和 Dog。 UnknownAnimal 没有任何额外的字段,因此此类不需要 SQL 表。为了使它更容易一点,Animal SQL Table 有一个鉴别器列 (TypeName) 来确定 Animal 类型。
SQL 表的代码和图片如下。它既不是 TPH 也不是 TPT,而是一种混合物。我看到的唯一解决方案是使其成为 TPT,通过创建一个 SQL 表“UnknownAnimal”并指向 UnknownAnimal 类来使用该表。但我不想采用这种方式,因为 UnknownAnimal 没有任何额外的属性并且占用了 SQL 服务器中的空间(不多)。
带有集成 Nunit 测试甚至数据库 .bak 文件的完整测试项目的代码。 https://bitbucket.org/RomeoQNgo/efinheritancetest/downloads
我尝试了 TPT,但这需要一个额外的 UnknownAnimal SQL 表。这意味着如果我有另一个类,如 UnknownAnimal(继承自 Animal,但没有额外的属性),那么我必须为它创建一个新表。一种简单的方法是在 Animal SQL 表中设置一个称为 TypeName 之类的鉴别器字段,并让它确定类类型。但是我不想使用 TPH,因为如果有更多的动物类型具有该动物独有的新属性(例如具有 TrunkLength 等属性的大象),那么我们必须在 Animals SQL 表中创建一个新列,而我没有除非没有可能,否则想走这条路。
所以我想将 TPH 和 TPT 结合起来,它们使用鉴别器字段 (TypeName) 来确定类类型和该类特有的动物额外属性的额外表。我想使用 Code First,不想为此使用任何 EDMX 文件。
我想知道目前使用 EF Code First 是否有任何好的方法。提前感谢您的帮助。
public interface IEntity2
{
string Creator { get; set; }
}
public interface IEntity
{
int Id { get; set; }
string DisplayName { get; set; }
}
[Table("Animals")]
public abstract class Animal : IEntity, IEntity2
{
public virtual int Id { get; set; }
public virtual string DisplayName { get; set; }
public virtual int TotalLegs { get; set; }
public string Creator { get; set; }
}
[Table("UnknownAnimals")]
public class UnknownAnimal : Animal
{
int test { get { return 1; } }
}
[Table("Fishes")]
public class Fish : Animal
{
public virtual int WaterType { get; set; }
}
[Table("Dogs")]
public class Dog : Animal
{
public virtual int FurLength { get; set; }
}
数据库图为:
【问题讨论】:
标签: entity-framework ef-code-first