EFコードファーストに保存したいクラスが2つあります。建物にはメンテナとそこで働く人々のリストがあります。mainainerは建物で働く必要はありません。
私の最初の試みで私はちょうど持っていた
public class Person
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
}
と
public class Building
{
public virtual Guid Id { get; set; }
public virtual List<Person> WorksHere { get; set; }
public virtual Person MaintainedBy { get; set; }
public virtual String Address { get; set; }
}
これにより、基本プロパティを持つ2つのテーブル、PeopleのBuilding_Id、およびBuildingsのMaintainedBy_Idが得られます。
テストプログラムを実行すると
using (TestContext tc = new TestContext())
{
Person m1 = tc.persons.Create();
m1.Name = "maintainB1";
m1.Id = Guid.NewGuid();
Person m2 = tc.persons.Create();
m2.Name = "maintainB2";
m2.Id = Guid.NewGuid();
Building b1 = tc.buildings.Create();
b1.Address = "building1";
b1.Id = Guid.NewGuid();
tc.buildings.Add(b1);
Building b2 = tc.buildings.Create();
b2.Address = "building1";
b2.Id = Guid.NewGuid();
tc.buildings.Add(b2);
b1.MaintainedBy = m1;
b2.MaintainedBy = m2;
if (b1.WorksHere == null) b1.WorksHere = new List<Person>();
if (b2.WorksHere == null) b2.WorksHere = new List<Person>();
b1.WorksHere.AddRange(new List<String>() { "e11", "e12", "e13" }.Select(s =>
{
Person p = new Person();
p.Id = Guid.NewGuid();
p.Name = s;
return p;
}));
b2.WorksHere.AddRange(new List<String>() { "e21", "e22", "e23" }.Select(s =>
{
Person p = new Person();
p.Id = Guid.NewGuid();
p.Name = s;
return p;
}));
b1.WorksHere.Add(m2);
b2.WorksHere.Add(m1);
tc.SaveChanges();
}
}
例外が発生します:「関係の外部キープロパティを公開しないエンティティの保存中にエラーが発生しました。単一のエンティティを例外のソースとして識別できないため、EntityEntriesプロパティはnullを返します。保存中の例外の処理は次のようになります。エンティティタイプの外部キープロパティを公開することで簡単になります。詳細については、InnerExceptionを参照してください。」
内部例外あり:「依存操作の有効な順序を決定できません。外部キーの制約、モデル要件、またはストアで生成された値が原因で、依存関係が存在する可能性があります。」
私のPocoでこれ以上プロパティを公開したくないのは、それらがPocoであり、これらのプロパティを使用できないためです。コードファーストモデルの生成を満たす必要がある場合は、それよりも必要ですが、可能であれば、マッピングクラスのPocoからそれを遠ざけたいと思います。
これを修正するにはどうすればよいですか?