1

これは非常に簡単に解決できるように思えるかもしれませんが、私が抱えている問題は、すべてのエンティティを格納するために階層ごとにテーブルがあり、同じテーブルに対して関係を作成できないことです。DBとクラスにあるものは次のとおりです。

ここに画像の説明を入力

ID、名前、およびタイプを持つ BaseObject という名前のテーブルが 1 つだけあります。そこに格納されているエンティティに対して 2 つのクラスを作成します。マスターとコンポーネント。タイプ列は識別子です。両方の関係を格納する別のテーブルがあります。マスターには多くのコンポーネントを含めることができ、コンポーネントには他の多くのコンポーネントを含めることもできます。

これは私がクラス用に持っているコードです:

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");
            });
    }
}

問題は、DB にクエリを実行するときに、DBSet マスターにアクセスしてマスターを取得できることですが、Component コレクションは常に「6 行目から始まるフラグメントのマッピングに問題があります: 条件メンバー 'BaseObject.Type' 'IsNull=False' 以外の条件がマップされています。BaseObject.Type の条件を削除するか、マッピングから削除してください。

何が起こっているのかわかりません。もちろん、クラスがそれぞれテーブルを指している場合、これは非常に簡単ですが、それが私の問題の根本であると思われます。

また、私はEFから始めたばかりです。まったく変更したくない既存の DB に基づいてクラスを作成したかったのです。本当に必要でない限り。私がやろうとしていることが正しいか間違っているか、または現在NHibernateを使用しているこのプロジェクトにEFを完全に実装するために最初に何をすべきかを教えてください。

ここで何か助けはありますか?ありがとう

4

1 に答える 1

2

最後に、この回答のおかげで問題を見つけました: EF4.1 Exception creating Database with table-per-hierarchy inheritance

問題は Base クラスのマッピングにあります。基本クラスと識別子を使用して子クラスを取得する場合、識別子はどちらのインスタンスでもプロパティであってはなりません。プロパティとして識別子を削除しただけで、正常に機能しました。私の例では、列「タイプ」が識別子です。

これが他の誰かに役立つことを願っています。

于 2013-08-06T19:39:21.420 に答える