2012-05-09 13 views
0

私はこの問題をしばらく扱っていますが、解決策を見つけることができないようです。私はEF 4 ObjectContextをラップするいくつかのリポジトリを持っています。以下の例は次のとおりです。Ninject MVC 2 - EF 4 ObjectContextの問題

public class HGGameRepository : IGameRepository, IDisposable 
{ 
    private readonly HGEntities _context; 

    public HGGameRepository(HGEntities context) 
    { 
     this._context = context; 
    } 

    // methods 

    public void SaveGame(Game game) 
    { 
     if (game.GameID > 0) 
     { 
      _context.ObjectStateManager.ChangeObjectState(game, System.Data.EntityState.Modified); 
     } 
     else 
     { 
      _context.Games.AddObject(game); 
     } 

     _context.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     if (this._context != null) 
     { 
      this._context.Dispose(); 
     } 
    } 
} 

そして私はNinjectModule以下があります。

public class DIModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<HGEntities>().ToSelf(); 
     this.Bind<IArticleRepository>().To<HGArticleRepository>(); 
     this.Bind<IGameRepository>().To<HGGameRepository>(); 
     this.Bind<INewsRepository>().To<HGNewsRepository>(); 
     this.Bind<ErrorController>().ToSelf(); 
    } 
} 

私はMVC 2の拡張、InRequestScope()にこれらのバインディングのデフォルトを使用していますので。

私の問題は、ObjectContextが正しく処理されていないことです。私はここで説明しているものを得る:

、それらが異なるのObjectContextのオブジェクトに添付されているので、2つのオブジェクト間の関係を定義することができない。https://stackoverflow.com/a/5275849/399584は具体的には、私が述べてInvalidOperationExceptionがを取得します。

これは、エンティティを更新しようとするたびに発生します。

バインドするように私のリポジトリを設定すると、それはうまくいくように思えますが、InSingletonScope()のようになります。

私は間違っていますか?

EDIT:分かりやすくするため、リクエストごとにすべてのreposと共有したいObjectContextが1つだけあります。

+0

'InSingletonScope()'の使用には問題ありません。 –

+0

スレッディング/キャッシングはどうですか?正直言って、私はこの状況(PHPから来ています)でどちらがうまく動作するかはわかりません。 –

答えて

1

モジュールにInRequestScope()を指定する必要があります。これに基づいて、articleはデフォルトのトランジェントになります。そのため、複数のコンテキストを取得しています。

public class DIModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<HGEntities>().ToSelf().InRequestScope(); 
     this.Bind<IArticleRepository>().To<HGArticleRepository>().InRequestScope(); 
     this.Bind<IGameRepository>().To<HGGameRepository>().InRequestScope(); 
     this.Bind<INewsRepository>().To<HGNewsRepository>().InRequestScope(); 
     this.Bind<ErrorController>().ToSelf().InRequestScope(); 
    } 
} 

ninjectをnugetパッケージマネージャーまたは旧式の方法でプロジェクトに追加しましたか?

+0

Nugetパッケージ。私は、MVC拡張でInRequestScope()がデフォルトになったと考えました。私は、NinjectWebCommonに以下のステートメントを持っています:DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));そして、Intellisenseによると、InRequestScope()は私の選択肢ではありません。 –

+0

Ninject.Web.Commonを使用して追加する必要がある別の名前空間に移動されました。 .InRequestScope()を呼び出すことができるようになります。私はあなたと同じ印象の下にいました。しかし、これが私にそれを働かせる唯一の方法でした。デフォルトスコープを設定する方法を示すサイトがいくつか見つかりましたが、カーネルを継承する必要がありました。 – bytebender

+0

ほとんど手に入れました。別の問題にぶつかるあなたが見てみたいと思ったら、私は新しい質問をしました。 http://stackoverflow.com/q/10526167/399584 –

関連する問題