2009-07-14 54 views
1

我之前問過這個問題,但我認爲我的表述不正確,所以這裏是第二個嘗試。我有以下代碼:ApplyPropertyChanges and References

public User EditUser(User userToEdit) 
{ 
    //userToEdit contains values for eagerly loaded contacts entity 

    User originalUser = (from u in _entities.UserSet.Include("contacts") 
           where u.ID == userToEdit.ID 
           select u).FirstOrDefault(); 

    _entities.ApplyPropertyChanges(originalUser.EntityKey.EntitySetName, userToEdit); 
    _entities.SaveChanges(); 

    return userToEdit;    
} 

非常直截了當。但是,聯繫人實體未更新。據我的理解,急切的加載將實體添加到數據上下文,因此當使用分離的userToEdit調用ApplyPropertyChanges時,userToEdit中聯繫人的更改將通過應用於連接的聯繫人實體進行。我錯過了什麼?

回答

1

是這是所謂的「Independent Associations

在EF的東西一個不幸的副作用(至少在3.5 SP1)關係不被認爲是實體的部分,即有獨立的。

這意味着調用ApplyPropertyChanges(...)只會影響實體的結構屬性而不影響引用。

所以,你需要你的代碼改成這樣:

public User EditUser(User userToEdit){  
    //userToEdit contains values for eagerly loaded contacts entity  
    User originalUser = (from u in _entities.UserSet.Include("contacts")         
     where u.ID == userToEdit.ID         
     select u).FirstOrDefault(); 

    _entities.ApplyPropertyChanges(originalUser.EntityKey.EntitySetName, userToEdit); 
    originalUser.Contacts = userToEdit.Contacts; 
    _entities.SaveChanges();  
    return userToEdit;    
} 

這假定userToEdit.Contacts是引用(不是集合),並且不爲空。

希望這有助於 亞歷

PS在.NET 4.0 Beta2中一種叫做FK associations將解決這一問題,並使它所以你的代碼會工作。

+0

非常感謝你,看起來它會做的伎倆。我急切地等待4.0版本的beta2,我對EF的大部分頭痛看起來像是要解決的。 – 2009-07-15 05:17:42