2012-05-06 6 views
0

私は、DbContext APIと共にEntity Framework 4を使用している汎用リポジトリを持っています。 Updateが呼び出されると、リポジトリはエンティティとリポジトリを作業単位オブジェクトに登録します。Entity Frameworkプロキシがレポジトリクラスを破る

作業ユニットでコミットが呼び出され、更新されたエンティティーがEFによってトラッキングされている場合(通常、リポジトリーはASP MVCおよびそのモデル・バインディング・テクノロジー用であるため)、タイプはプロキシー・タイプです。型がモデルに存在しないため、例外がスローされます。 PersistUpdateOfは、EFがプロキシクラスを使用するため、エンティティがEFによって追跡されたときに転倒します。添付の画像にこれが示されています。

トラッキングされたエンティティまたはトラッキングされていないエンティティで動作するプロキシを無効にすることを含む回避策はありますか。

public void Update<TEntity>(TEntity entity) where TEntity : EntityBase 
    { 
     //Audit the update 
     if (entity is IAuditable) 
     { 
      (entity as IAuditable).AuditEntityUpdate(); 
     } 

     //Register the entity as Amended with the unit of work 
     _unitOfWork.RegisterAmended(entity, this); 
    } 


    public virtual void PersistUpdateOf(EntityBase entity) 
    { 
     _context.Set(entity.GetType()).Attach(entity); 
     _context.Entry(entity).State = EntityState.Modified; 
    } 

答えて

1

エンティティAttachを削除するだけです。プロキシエンティティは、それを作成したコンテキストによって追跡されることに注意してください。 Detachを入力していないかAsNoTracking()を使用した場合は、別のコンテキストに追加することはできません。

public virtual void PersistUpdateOf(EntityBase entity) 
{ 
    _context.Entry(entity).State = EntityState.Modified; 
} 
+0

スムース!私は、エンティティフレームワークに関するMicrosoftのチュートリアルから、この状況で何もしないアタッチコードを得ました:( – Lee

+0

削除のために何をすればよいでしょうか:_context.Set(entity.GetType())。 EntityStateを削除/削除に設定しますか? – Lee

+0

@leeはい。_context.Set(entity.GetType())の代わりに、_context.Set(typeof(TEntity))をリポジトリ内で使用できます。 – Eranga

関連する問題