【问题标题】:Entity Framework Code First: MultiLevel TPC Inheritance With Relationships in the Middle Level实体框架代码优先:多级 TPC 继承与中间层的关系
【发布时间】:2012-07-18 14:11:08
【问题描述】:

我正在使用 TPC 继承将复杂对象模型映射到现有数据库。当我在继承结构的中间级别创建关系时遇到了问题。

public class ParentClass
{
}

public class MiddleClass : ParentClass
{
    public Int64 RelationshipId;
    public Relationship Relationship;
}

public class ChildClass1 : MiddleClass
{
}

public class ChildClass2: MiddleClass
{
}

public class Relationship
{
    public string RelationshipInfo { get; set; }
}

public class MyEntities : DbContext
{
    public DbSet<ParentClass> Parents
    public override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ChildClass1>.Map(m => m.MapInheritedProperties);
        modelBuilder.Entity<ChildClass2>.Map(m => m.MapInheritedProperties);

        modelBuilder.Entity<MiddleClass>.HasRequired(mc => mc.Relationship).WithMany().HasForeignKey(mc => mc.RelationshipId);
    }
}

在我添加 modelBuilder.Entity&lt;MiddleClass&gt;.HasRequired(mc =&gt; mc.Relationship).WithMany().HasForeignKey(mc =&gt; mc.RelationshipId); 行之前,我的模型将一直有效。我必须将这种关系映射到每个孩子吗?

我收到的错误是“无法按照定义映射“MiddleClass”类型,因为它映射了使用实体拆分或其他继承形式的类型继承的属性。'

【问题讨论】:

    标签: c#-4.0 entity-framework-4.1 ef-code-first


    【解决方案1】:

    我找到了答案(有点)here。基本答案是,由于任何继承的类都不表示为数据库中的表,因此您无法在这些表上创建关系。

    即使尝试像这样通过父类映射继承的属性也行不通:

    modelBuilder.Entity<ChildClass>()
                .HasRequired(cc => cc.Relationship).WithMany().HasForeignKey(cc => cc.RelationshipId);
    

    它理解关系对象仍然是中间类“表”的一部分,并尝试将其映射到那里。似乎唯一的操作是将所有关系对象都放在子类中。

    public class ParentClass
    {
    }
    
    public class MiddleClass : ParentClass
    {
        public Int64 RelationshipId;
        public Relationship Relationship;
    }
    
    public class ChildClass1 : MiddleClass
    {
        public Int64 RelationshipId;
        public Relationship Relationship;
    }
    
    public class ChildClass2: MiddleClass
    {
        public Int64 RelationshipId;
        public Relationship Relationship;
    }
    
    public class Relationship
    {
        public string RelationshipInfo { get; set; }
    }
    

    这不是最佳解决方案,但您可能可以通过 EntityConfigurations 的继承结构进行映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多