实体框架代码首先为嵌套类中的同一属性创建重复的外键,具有一到零的关系。
例:
abstract class A {}
public class MyClass {}
public class B:A {
...
public int MyClassId {get; set;}
public virtual MyClass MyClass { get; set;}
}
public class C:A {
...
public int MyClassId {get; set;}
public virtual MyClass MyClass { get; set;}
}
类 B 和 A 指向 DB 中的同一表 A。
我有他们俩的下一个配置
modelBuilder.Entity<B>().HasRequired(x => x.MyClass).WithMany()
.HasForeignKey(x => x.MyClassId).WillCascadeOnDelete(false);
modelBuilder.Entity<C>().HasRequired(x => x.MyClass).WithMany()
.HasForeignKey(x => x.MyClassId).WillCascadeOnDelete(false);
问题是EF在表A中创建两列MyClassId和MyClassId1而不是一列。
我需要更改什么才能只有一列 MyClassId ?
我无法将 MyClass 属性移动到类 A,因为有许多类嵌套自 A 并且不应该具有此属性。我也无法在 A 和 B,C 之间创建代理类。
谢谢
你必须:
public class ConcreteA : A {
public int MyClassId {get; set;}
public virtual MyClass MyClass { get; set;}
}
然后
public class B:ConcreteA {
...
}
与 C 相同。
这不是问题/错误。这是一个功能。
您可以在此处阅读有关TPH的信息:http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph
基本上,您选择使用每次继承的表,即按类隔离属性,但将它们全部放在同一个 Db 表中。
也可以说:(A)B == (A)C,但由于MyClass不是A => B.MyClass <> C.MyClass 的一部分