2013-11-29 103 views
4

我正在使用EF 6.0和代碼優先的方法。 我有通過實體框架在數據庫中創建和更新數據的問題。我不確定在儲存學生之前是否需要製作db.Groups.Attach(student.Group)。沒有這個保存後學生,我也有新的組,但有其他GroupId相同的名稱。實體框架:創建和更新WPF中的相關對象

而且因爲我得到例外,我不能更新學生: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 
      } 
     } 
    } 
} 

回答

2

沒有這個(db.Groups.Attach(student.Group))保存後的學生我也有新的組

這是因爲Add荷蘭國際集團的實體到DbSet馬克所有秉承還沒有被上下文跟蹤的實體。這是一個EF功能,不管它與否,所以你必須首先附加你不想重新插入的實體。

而且因爲我得到異常

出於某種原因,在更新方法的學生及其集團仍連接到一點,我不能更新的學生。顯然,StudentDao類中還有其他一些上下文。您必須確保在更新學生時或其他(次好)分離學生和小組時,此環境的使用期限已結束。

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

+0

感謝您的回覆。 「在服務類方法中使用DbContext及其DbSets」是什麼意思?你的意思是在一個類中有一個dbcontext嗎?你能詳細說明一篇文章嗎? – Amir

-1

已經有一段時間我曾在實體但是從我記得你不能只更改組,你必須給它一個組ID字段,以及,更改,而不是再重裝/更新學生對象,以便Group對象從同一個上下文中加載和分配。

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

+0

所以我需要改變GroupId而不是Group?這意味着在班級學生中我必須擁有Group和GroupId? – WojciechKo

+0

是的。至少這是我在過去曾經參與過的實體框架項目中看到的。 –

相關問題