我正在使用EF 6.0和代码优先方法.
我有通过Entity Framework在db中创建和更新数据的问题.我不确定在存储Student之前是否需要创建db.Groups.Attach(student.Group).保存学生后没有这个,我也有新的组,其名称与其他GroupId相同.
我有通过Entity Framework在db中创建和更新数据的问题.我不确定在存储Student之前是否需要创建db.Groups.Attach(student.Group).保存学生后没有这个,我也有新的组,其名称与其他GroupId相同.
此外,我无法更新学生,因为我遇到异常:无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象.
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<Student> 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 } } } }
解决方法
Without this (db.Groups.Attach(student.Group)) after saving Student I also have new Group
这是因为将实体添加到DbSet会将所有尚未被上下文跟踪的粘附实体标记为已添加.这是一个EF功能,不管你喜不喜欢,所以你必须先附加你不想重新插入的实体.
Moreover I can’t update student because I’m getting exception
出于某种原因,在更新方法中,学生及其组仍然附加到上下文.显然,StudentDao课程中还有其他一些活动.当您更新学生时,您必须确保此上下文的生命周期结束,否则(第二好)将学生和小组从中分离.
一个偏离主题的建议:如果可以的话,放弃这个DAO模式.当您在处理一个工作单元的类似服务的方法中使用DbContext及其DbSets时,EF工作得更好.使用这些DAO,它不可能在事务上工作,并且它们会导致大量重复的代码.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。