entity framework:在WPF中创建和更新相关对象

我正在使用EF 6.0和代码优先方法。 我有通过Entity Framework在db中创建和更新数据的问题。 我不确定在存储Student之前是否需要创建db.Groups.Attach(student.Group) 。 保存学生后没有这个,我也有新的组,其名称与其他GroupId相同。

此外,我无法更新学生,因为我遇到exception: The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.

 public class Student { [Key] public int StudentId {get; set;} public string Name {get; set;} public Group Group {get; set;} } public class Group { [Key] public int GroupId{ get; set;} public string Name {get; set;} public virtual ICollection Students {get; set;} } 

 public class StudentDao { public void createStudent(Student student) { using (var db = new StorageContext()) { // without this also creates new Group. db.Groups.Attach(student.Group); db.Students.Add(student); db.SaveChanges(); } } public void updateStudent(Student student) { using (var db = new StorageContext()) { var original = db.Students.Find(student.StudentId); if (original != null) { original.Name = student.Name; original.Group = student.Group; db.SaveChanges(); //exception } } } } 

没有这个( db.Groups.Attach(student.Group) )保存学生后我也有了新的组

这是因为Add实体AddDbSet 所有尚未被上下文跟踪的粘附实体标记为已添加。 这是一个EFfunction,不管你喜不喜欢,所以你必须先附加你不想重新插入的实体。

此外,我无法更新学生,因为我得到例外

出于某种原因,在更新方法中,学生及其组仍然附加到上下文。 显然, StudentDao课程中还有其他一些活动。 当您更新学生时,您必须确保此上下文的生命周期结束,否则(第二好)将学生和小组从中分离。

一个偏离主题的建议:如果可以的话,放弃这个DAO模式。 当您在处理一个工作单元的类似服务的方法中使用DbContext及其DbSet时,EF工作得更好。 使用这些DAO,它不可能在事务上工作,并且它们会导致大量重复的代码。

从我在Entity上工作已经有一段时间但是从我记得你不能只改变组,你必须给它一个GroupID字段,改为改变它然后从数据库重新加载/更新Student对象,以便组对象从同一上下文中加载和分配。

这只是我使用NHibernate的原因之一。