新規ではないオブジェクト/エンティティのグラフを持つ新しいエンティティを追加しようとして問題が発生しました。
コードファーストアプローチを使用したドメインタイプは次のとおりです。
public class Person : IEntity
{
public int Id { get; set; }
public string Name { get; set; }
public List<PersonSession> Sessions { get; set; }
}
public class PersonSession : IEntity
{
public int Id { get; set; }
public Person Person { get; set; }
public Session Session { get; set; }
}
public class Session : IEntity
{
public int Id { get; set; }
public string Title { get; set; }
}
だから私には人がいて、彼らは多くのセッションを持つことができ、彼らのセッションのテーブルがあります。ただし、Sessionテーブルには、personへの参照はありません。これが、PersonSessionsテーブル/リレーションシップの目的です。
EF 5は、1つのDbSetを使用してこれらの3つのテーブルを作成します。
しかし、Genericsを使用して単純なリポジトリパターンを作成しようとしています。Saveメソッドがあります。
唯一の問題は、Repository.GetAll()によって与えられた既存のセッションを使用している場合でも、Sessionsテーブルに新しいセッションを追加することです。
public int Save(T t)
{
if (t.Id == 0)
_context.Entry(t).State = EntityState.Added;
else
_context.Entry(t).State = EntityState.Modified;
_context.SaveChanges();
return t.Id;
}
したがって、2つの新しいセッションを作成し、それらをSessionsのGeneric Repoインスタンスを介して追加すると、正しく追加されます。
私が新しい人を作成して、そのような既存のセッションを彼に与えるとき:
private static void AddPerson()
{
var newPerson = new Person
{
JobTitle = EJobTitle.SoftwareDeveloper,
Name = "Mark W",
};
var sessionsForPerson = new List<PersonSession>();
var session1 = _sessionRepo.Retrieve(1);
var session2 = _sessionRepo.Retrieve(2);
sessionsForPerson.Add(new PersonSession
{
Session = session1,
Person = newPerson
});
sessionsForPerson.Add(new PersonSession
{
Session = session2,
Person = newPerson,
});
newPerson.Sessions = sessionsForPerson;
_personRepo.Save(newPerson);
}
2回目のセッションの追加です。
PersonSession.Sessionプロパティに追加して、これが常に既存のセッションになることを通知できるデータ属性はありますか、それともFluentApiで何かを使用してEFに指示する必要がありますか?
ありがとう。