首先是EF代码的有趣继承。你认为有一种映射策略可以使这项工作吗?
所以我有一个名为“Animal”的基本抽象类和3个来自Animal类,Fish,Dog和UnknownAnimal的派生类。 Animal类有自己的SQL表,Fish和Dog分别有SQL表Fish和Dog。 UnknownAnimal没有任何额外字段,因此不需要此类的SQL表。为了使它更容易,Animal SQL Table有一个鉴别器列(TypeName)来确定Animal类型。
下面是SQL表的代码和图片。它既不是TPH,也不是TPT,而是混合物。我看到的唯一解决方案是通过创建一个SQL表“UnknownAnimal”并指向UnknownAnimal Class来使用此表来使其成为TPT。但是我不想这样做,因为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; }
}
数据库图表是: