[英]Entity Framework Core fail to update object with related objects included
[英]Entity Framework: Create and update related objects in WPF
我正在使用EF 6.0和代碼優先方法。 我有通過Entity Framework在db中創建和更新數據的問題。 我不確定在存儲Student之前是否需要創建db.Groups.Attach(student.Group)
。 保存學生后沒有這個,我也有新的組,其名稱與其他GroupId相同。
此外,我無法更新學生,因為我遇到異常: 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<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
}
}
}
}
沒有這個( db.Groups.Attach(student.Group) )保存學生后我也有了新的組
這是因為Add
實體Add
到DbSet
所有尚未被上下文跟蹤的粘附實體標記為已添加。 這是一個EF功能,不管你喜不喜歡,所以你必須先附加你不想重新插入的實體。
此外,我無法更新學生,因為我得到例外
出於某種原因,在更新方法中,學生及其組仍然附加到上下文。 顯然, StudentDao
課程中還有其他一些活動。 當您更新學生時,您必須確保此上下文的生命周期結束,否則(第二好)將學生和小組從中分離。
一個偏離主題的建議:如果可以的話,放棄這個DAO模式。 當您在處理一個工作單元的類似服務的方法中使用DbContext
及其DbSet
時,EF工作得更好。 使用這些DAO,它不可能在事務上工作,並且它們會導致大量重復的代碼。
自從我在Entity工作了一段時間后,但是從我記憶中你不能只改變組,你必須給它一個GroupID字段,改為改變它然后從數據庫重新加載/更新Student對象,以便組對象從同一上下文中加載和分配。
這只是我使用NHibernate的原因之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.