实体框架代码首先为嵌套类中的同一属性创建重复的外键



实体框架代码首先为嵌套类中的同一属性创建重复的外键,具有一到零的关系。

例:

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 的一部分

相关内容

  • 没有找到相关文章

最新更新