2009-07-14 4 views
1

私はこの質問を以前に聞いたことがありますが、私は誤った言い方をしていると思うので、ここでは2番目の試みです。私は次のコードを持っています:ApplyPropertyChangesと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

はいこれはEFで「Independent Associations

と呼ばれるものの不幸な副作用である(少なくとも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を基準(ないコレクション)で、かつnullでないことを前提としています。

希望これは アレックス

PSでは.NET 4.0ベータ2 FK associationsと呼ばれるものは、この問題を解決し、それはそうあなたのコードは動作しますでしょうを支援します。

+0

非常にありがとう、それはトリックを行うように見えます。私は熱心に4.0のベータ2を待っていますが、私がEFで持っていた頭痛の大部分は、彼らが対処されるように見えます。 –

+0

ありがとうございます。あなたはuserToEdit.Contactsがコレクションではないと言っていました。 userToEdit.Contactsがコレクションであり参照ではない場合、どのように変更する必要がありますか。私の場合、項目はEntityCollection型です。助けてください。 –

関連する問題