c# – 实体框架:在WPF中创建和更新相关对象
我正在使用EF 6.0和代码优先方法.
我有通过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 } } } } 解决方法
这是因为将实体添加到DbSet会将所有尚未被上下文跟踪的粘附实体标记为已添加.这是一个EF功能,不管你喜不喜欢,所以你必须先附加你不想重新插入的实体.
出于某种原因,在更新方法中,学生及其组仍然附加到上下文.显然,StudentDao课程中还有其他一些活动.当您更新学生时,您必须确保此上下文的生命周期结束,否则(第二好)将学生和小组从中分离. 一个偏离主题的建议:如果可以的话,放弃这个DAO模式.当您在处理一个工作单元的类似服务的方法中使用DbContext及其DbSets时,EF工作得更好.使用这些DAO,它不可能在事务上工作,并且它们会导致大量重复的代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 一个applicationContext.xml配置
- Vertex Pipeline (顶点管线)
- C抱怨将char **值传递给函数,取char const * const * const
- 通过vue-cli3构建一个SSR应用程序的方法
- Nebula2探秘附件:nutildef与nkernelinfo的代码
- 正则表达式
- A FLASH Bootloader for PIC16 and PIC18 Devices--硬译(三
- CAS 3.4 单点退出详细配置(Configuring Single Sign Out )
- c# – 确定整数列表中的第一个可用值
- 在任何iPhone / iPod touch设备上运行应用程序时出现内部AP