这似乎很容易解决,但我遇到的复杂情况是每个层次结构都有一个表来存储所有实体,而我无法在同一个表上创建关系。以下是我在DB和类中的内容:
我只有一个名为BaseObject的表,其中包含ID,名称和类型。我将为存储在那里的那些实体创建两个类。主人和组件。 type列是鉴别器。我有另一个表来存储两者之间的关系:一个master可以有很多组件,一个组件也可以有许多其他组件。
这是我为课程编写的代码:
public partial class BaseObject
{
public BaseObject()
{
}
public System.Guid ID { get; set; }
public string Name { get; set; }
public Nullable<int> Type { get; set; }
}
public class MasterObject : BaseObject
{
public virtual ICollection<ComponentObject> Components { get; set; }
public MasterObject()
{
this.Components = new List<ComponentObject>();
}
}
public class ComponentObject : BaseObject
{
public virtual ICollection<MasterObject> MasterObjects { get; set; }
public ComponentObject()
{
this.MasterObjects = new List<MasterObject>();
}
}
这些是映射:
public class BaseObjectMap : EntityTypeConfiguration<BaseObject>
{
public BaseObjectMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Table & Column Mappings
this.ToTable("BaseObject");
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.Name).HasColumnName("Name");
//configure the inheritance in here
this.Map<MasterObject>(m => m.Requires("Type").HasValue(1));
this.Map<ComponentObject>(m => m.Requires("Type").HasValue(2));
}
}
public class MasterObjectMap : EntityTypeConfiguration<MasterObject>
{
public MasterObjectMap()
{
this.HasMany<ComponentObject>(t => t.Components)
.WithMany(t => t.MasterObjects)
.Map(c =>
{
c.ToTable("ObjectComponents");
c.MapLeftKey("ComponentObjectID");
c.MapRightKey("BaseObjectID");
});
}
}
public class ComponentObjectMap : EntityTypeConfiguration<ComponentObject>
{
public ComponentObjectMap()
{
this.HasMany<MasterObject>(t => t.MasterObjects)
.WithMany(t => t.Components)
.Map(m =>
{
m.ToTable("ObjectComponents");
m.MapLeftKey("BaseObjectID");
m.MapRightKey("ComponentObjectID");
});
}
}
问题在于,当查询数据库时,我可以通过访问DBSet Masters获得Master,但是Component集合总是给出一个无意义的异常,说“从第6行开始映射片段的问题:条件成员'BaseObject映射除了'IsNull = False'之外的条件'。'删除BaseObject.Type上的条件或从映射中删除它。“
我不明白发生了什么。当然,如果指向每个表的类,这将是非常容易的,但我怀疑这是我的问题的根源。
另外,我刚开始使用EF。我想根据我现在不想修改的现有数据库创建类。除非真的需要它。请指导我,如果我正在尝试做的是对还是错,或者我应该首先在目前使用NHibernate的这个项目上完全实现EF。
这里有什么帮助吗?感谢
答案 0 :(得分:2)
最后,由于这个答案,我发现了这个问题:EF4.1 Exception creating Database with table-per-hierarchy inheritance
问题在于Base类的映射。当使用基类和鉴别器来获取子类时,鉴别器绝不应该是属性。刚删除鉴别器作为财产,它工作正常。在我的例子中,'Type'列是鉴别器。
希望这有助于其他人。