簡體   English   中英

實體框架:在WPF中創建和更新相關對象

[英]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實體AddDbSet 所有尚未被上下文跟蹤的粘附實體標記為已添加。 這是一個EF功能,不管你喜不喜歡,所以你必須先附加你不想重新插入的實體。

此外,我無法更新學生,因為我得到例外

出於某種原因,在更新方法中,學生及其組仍然附加到上下文。 顯然, StudentDao課程中還有其他一些活動。 當您更新學生時,您必須確保此上下文的生命周期結束,否則(第二好)將學生和小組從中分離。

一個偏離主題的建議:如果可以的話,放棄這個DAO模式。 當您在處理一個工作單元的類似服務的方法中使用DbContext及其DbSet時,EF工作得更好。 使用這些DAO,它不可能在事務上工作,並且它們會導致大量重復的代碼。

自從我在Entity工作了一段時間后,但是從我記憶中你不能只改變組,你必須給它一個GroupID字段,改為改變它然后從數據庫重新加載/更新Student對象,以便組對象從同一上下文中加載和分配。

這只是我使用NHibernate的原因之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM