1

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

实施例:

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甲

我有一个配置对他们俩

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在表中创建一个两列MyClassId ANS MyClassId1而不是一个。

我需要更改为只有一列MyClassId

我无法将MyClass属性移动到类A中,因为有许多从A嵌套并且不应具有此属性的类。 另外我无法在A和B之间创建代理类C。

感谢

+0

你为什么不只是移动'公众的一部分int MyClassId'和'公共虚拟MyClass MyClass'到'A'类? – user2216

+0

A中有大约10个嵌套类,它们不应该具有MyClass属性。 – AsTi

+0

在这种情况下,您将拥有一个“稀疏矩阵”类型的表格,即大量空单元格。 – tschmit007

回答

0

你必须:

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

基本上你选择使用表每继承,即通过类孤立你的属性,但具有相同的数据表全部。

我们也可以说:(A)B ==(A)C,但由于MyClass的不是A => B.MyClass <> C.MyClass

+0

您能否提供信息为什么发生问题? – user2216

+0

阅读我最后编辑的问题。我不能将它移动到A并且创建一个代理类'A'。 – AsTi

+0

有没有办法将它映射到表A中的同一列而不创建重复的列? – AsTi

相关问题