gpt4 book ai didi

c# - Entity Framework : Create and update related objects in WPF

转载 作者:行者123 更新时间:2023-11-30 12:46:28 26 4
gpt4 key购买 nike

我正在使用 EF 6.0 和代码优先方法。我在通过 Entity Framework 在数据库中创建和更新数据时遇到问题。我不确定在存储 Student 之前是否需要制作 db.Groups.Attach(student.Group)。如果没有这个,在保存 Student 之后,我还有一个具有相同名称但其他 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

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

Moreover I can't update student because I'm getting exception

出于某种原因,在更新方法中,学生及其小组仍然依附于上下文。显然,StudentDao 类中还有一些其他事件上下文。当您更新学生时,您必须确保此上下文的生命周期结束,否则(次优)将学生和小组从中分离。

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

关于c# - Entity Framework : Create and update related objects in WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20277478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com