2012-07-18 44 views
0

我正在使用TPC继承将复杂对象模型映射到现有数据库。当我在继承结构的中间层次创建关系时,我遇到了一个问题。实体框架代码第一:具有中间关系的多级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<MiddleClass>.HasRequired(mc => mc.Relationship).WithMany().HasForeignKey(mc => mc.RelationshipId);线。我是否必须将这种关系映射到每个孩子?

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

回答

0

我找到了答案(排序)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的继承结构进行映射。

相关问题