2011-08-15 14 views
1

私はCode First Entity Framework 4.1を使用しています。私が使用している2つのエンティティは "State"と "User"です。各状態エントリは、以下に示すように、「CreatedBy」ユーザおよび「ModifiedBy」ユーザプロパティを有する。同じキーでデタッチしたエントリを添付する

public class State { 
    public virtual User CreatedBy { get; set; } 
    public virtual User ModifiedBy { get; set; } 
} 

ユーザーエンティティには、状態エンティティに対する後方参照がありません。つまり、状態=>ユーザーは「単方向」です。

同じ「CreatedBy」および「ModifiedBy」ユーザープロパティを持つ分離状態エンティティがある場合に問題が発生します。状態エンティティをdbContextにアタッチしようとすると、EntityFrameworkはObjectStateManagerによって検出された重複エントリに不満を持ちます。私はこの問題のための簡単な解決策を探していました。

答えて

0

一つの解決策は、同じキーを持つUserは、コンテキストに既にあるし、そうならば、コンテキストに添付されているオブジェクトによって、あなたのStateエンティティに切り離さUser参照を置き換えるかどうかを確認することです。 stateアタッチする新しいState実体である、と言う:

if (state.CreatedBy != null) 
{ 
    var attachedCreatedBy = context.ChangeTracker.Entries() 
     .Where(e => e.Entity is User 
       && e.Cast<User>().Entity.Id == state.CreatedBy.Id) 
     .Select(e => e.Entity) 
     .SingleOrDefault(); 

    if (attachedCreatedBy != null) 
     state.CreatedBy = attachedCreatedBy; 
} 

if (state.ModifiedBy != null) 
{ 
    var attachedModifiedBy = context.ChangeTracker.Entries() 
     .Where(e => e.Entity is User 
       && e.Cast<User>().Entity.Id == state.ModifiedBy.Id) 
     .Select(e => e.Entity) 
     .SingleOrDefault(); 

    if (attachedModifiedBy != null) 
     state.ModifiedBy = attachedModifiedBy; 
} 

context.States.Attach(state); // now it should not throw an exception anymore 

まあ、私はしかし、「シンプルなソリューション」これを呼び出すことはありません。しかし私は別のものを知らない。 Stateに外部キーのプロパティCreatedByIdModifiedByIdがある場合、それはより簡単になります。 CreatedByModifiedBynullに設定して、関連するユーザーのIDに外部キーのプロパティを設定するだけで済みます。

関連する問題