微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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
            }
        }
    }
}

解决方法

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,它不可能在事务上工作,并且它们会导致大量重复的代码.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐