我在旧数据库中有两个表(我无法修改),数据如下:
Table1 有一个复合主键(Code、Abbrev),但 Abbrev 也用作鉴别器(见下文)。Table2 有两个外键列(CodeA、CodeB),它们都引用 Table1 中的相同字段 Code。Table1.Code 字段中有重复项。
我想在 Entity framework 6 中使用 table-per-hierarchy 方法。因此,我创建了以下模型类:
[Table("Table1")]
public class MyBaseClass
{
[Key]
public string Code { get; set; }
}
public class MyBaseClassA : MyBaseClass
{
}
public class MyBaseClassB: MyBaseClass
{
}
[Table("Table2")]
public class SubClass
{
[Key]
public int Id { get; set; }
[Required]
[ForeignKey("MyBaseClassA")]
public string CodeA { get; set; }
public virtual MyBaseClassA ClassA { get; set; }
[Required]
[ForeignKey("MyBaseClassB")]
public string CodeA { get; set; }
public virtual MyBaseClassB ClassB { get; set; }
}
我在 DataContext : DbContext 类中定义了 table-per-hierarchy ,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyBaseClass>().Map<MyBaseClassA>(m => m.Requires("Abbrev").HasValue("A"))
.Map<MyBaseClassB>(m => m.Requires("Abbrev").HasValue("B"));
}
问题是当我想使用这种映射时 - 我不能使用鉴别器字段(Table1.Abbrev)作为 MyBaseClass 中复合键的一部分 - 我收到以下错误:
EntitySet 'DataContext.MyBaseClass' 中的所有对象都必须具有唯一的主键。但是,“MyBaseClassA”类型的实例和“MyBaseClassB”类型的实例都具有相同的主键值,“EntitySet=MyBaseClass;Code=1”。
是否可以将上面的模型与实体框架 6(或更高版本)映射?