1

这似乎很容易解决,但我遇到的复杂情况是每个层次结构都有一个表来存储所有实体,并且我无法在同一个表上创建关系。这是我在数据库和类中的内容:

在此处输入图像描述

我只有一个名为 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,请指导我。

这里有什么帮助吗?谢谢

4

1 回答 1

2

最后,由于这个答案,我找到了问题:EF4.1 Exception create Database with table-per-hierarchy inherit

问题在于基类的映射。当使用基类和鉴别器来获取子类时,鉴别器不能是两个实例中的属性。刚刚删除了鉴别器作为属性,它工作正常。在我的示例中,“类型”列是鉴别器。

希望这对其他人有帮助。

于 2013-08-06T19:39:21.420 回答