这似乎很容易解决,但我遇到的复杂情况是每个层次结构都有一个表来存储所有实体,并且我无法在同一个表上创建关系。这是我在数据库和类中的内容:
我只有一个名为 BaseObject 的表,其中包含 ID、名称和类型。我将为存储在那里的那些实体创建两个类。主和组件。类型列是鉴别器。我有另一个表来存储两者之间的关系:一个主可以有许多组件,一个组件也可以有许多其他组件。
这是我的课程代码:
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.Type' “IsNull=False”以外的条件被映射。要么删除 BaseObject.Type 上的条件,要么将其从映射中删除。
我不明白发生了什么。当然,如果每个类都指向一个表,这将非常容易,但我怀疑这是我问题的根源。
另外,我只是从 EF 开始。我想根据我根本不想修改的现有数据库创建类。除非真的需要。如果我正在尝试做的是对还是错,或者我应该首先做什么以在当前使用 NHibernate 的项目上完全实施 EF,请指导我。
这里有什么帮助吗?谢谢