これは非常に簡単に解決できるように思えるかもしれませんが、私が抱えている問題は、すべてのエンティティを格納するために階層ごとにテーブルがあり、同じテーブルに対して関係を作成できないことです。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を完全に実装するために最初に何をすべきかを教えてください。
ここで何か助けはありますか?ありがとう