2017-09-15 22 views
0

あなたが見ることができるように、私はこのような構造を持つクラスがたくさんある:コンストラクタでのデシベルコンテキストはninjectの.asによって注入されEFが返すExecuteReaderには、開いて利用可能な接続が必要です。接続の現在の状態は開いています。エラー

public class OrganizationUserRepository : IOrganizationUserRepository 
    { 
     private DataContext _ctx; 

     public OrganizationUserRepository(DataContext ctx) 
     { 
      _ctx = ctx; 
     } 
     public bool Add(OrganizationUser entity) 
     { 
      try 
      { 
       _ctx.OrganizationUsers.Add(entity); 
       _ctx.SaveChanges(); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       // TODO log this error 
       return false; 
      } 
     } 

     public bool Edit(OrganizationUser entity) 
     { 
      try 
      { 
       OrganizationUser Edited = _ctx.OrganizationUsers.Where(i => i.Id == entity.Id).First(); 
       _ctx.Entry(Edited).CurrentValues.SetValues(entity); 
       _ctx.SaveChanges(); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       // TODO log this error 
       return false; 
      } 
     } 



     public bool Remove(string id) 
     { 
      try 
      { 
       Int64 Id = Int64.Parse(id); 
       OrganizationUser obj = _ctx.OrganizationUsers.Where(i => i.Id == Id).First(); 
       _ctx.OrganizationUsers.Remove(obj); 
       _ctx.SaveChanges(); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       // TODO log this error 
       return false; 
      } 
     } 


    } 

私は、マルチクラスを持っている.AND私のクラスのひとつ、それを見ることができます。単一DBを使用する他のサービス(WCFサービス)で、この.Butように私は私のWCFトレースログでこのエラーを取得する:

ExecuteReader requires an open and available Connection. The connection's current state is open. 

私は最初のEFコードを使用しています。

私はこれを見つけましたWrap DbContext db = new DbContext() inusing statement.そして、私はこれを使用すべきかどうかを知りたがっています。私のクラス構造を自分のコードで使用するように変更できますか?

答えて

0

私はpublic Readonly DbContextを使用しました。読み取り専用を削除しても問題ありません。

+0

私は思いますそれはoopで間違っています。依存関係マッパーを共有できますか? –

+0

しかし、それは私の問題を解決しました –

+0

どの部分が間違っていますか? –

0

まず、データベース初期化プログラムをロックします。

public class EFDB : DbContext 
{ 
    private static object _lock = new object(); 
    static EFDB() 
    { 
     lock (_lock) 
     { 
      IDatabaseInitializer<EFDB> initializer = null; 
      Database.SetInitializer(initializer); 
     } 
    } 
} 

そして

private static readonly object _ninjectLock = new Object(); 
    private static bool _ninjectModulesLoaded; 

    public static bool NinjectModulesLoaded() 
    { 
     lock (_ninjectLock) 
     { 
      bool tmp = _ninjectModulesLoaded; 
      _ninjectModulesLoaded = true; 
      return tmp; 
     } 
    } 

(ninjectモジュールは1時間をロードする必要があります)あなたのNinjectモジュールをロックし、あなたのサービス拠点にあなたは、このようなモジュールをロードする必要があります

static ServiceBase() 
    { 
     if (!NinjectModulesLoaded()) 
     { 
      DependencyFactory.Load(DataAccessDependencyMapper()); 
     } 
    } 
関連する問題