尝试添加具有非新对象/实体图的新实体时遇到问题。
这是我使用 Code First 方法的域类型:
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 表虽然不会对人员有任何引用,但这就是 PersonSessions 表/关系的用途。
EF 5 确实使用一个 DbSet 创建了这 3 个表。
但是我正在尝试使用泛型制作一个简单的存储库模式,并且我有一个 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);
}
它正在第二次添加会话。
是否有一个数据属性可以放在 PersonSession.Session 属性上,告诉它这将始终是一个现有会话,还是我需要在 FluentApi 中使用某些东西来指示 EF?
谢谢。