2016-12-27 9 views
0

私は、流暢なnhibernateとc#asp.netのデータベースに複数の項目を保存することに問題があります。AdoTransaction - isolationlevelがnull asp.net mvc 5流暢なnhibernate

public static readonly ISessionFactory SessionFactory = DbContext.SessionFactory(); 
    public static readonly ISession Session = SessionFactory.OpenSession(); 
    public static readonly ITransaction Transaction = Session.BeginTransaction(); 

    public IEnumerable<Candidate> Candidates => Session.Query<Candidate>(); 

    public Candidate GetUser(int id) 
    { 
     return Session.Query<Candidate>().FirstOrDefault(x => x.Id == id); 
    } 

    public void AddCandidate(Candidate candidate) 
    { 
     try 
     { 
      Session.Save(candidate); 
      Transaction.Commit(); 
     } 
     catch (Exception exception) 
     { 
      throw; 
     } 

    } 

を、エラーは次のとおりです:私は持っているのIsolationLevel = '((NHibernate.Transaction.AdoTransaction)トランザクション).IsolationLevel' タイプの例外をスローした 'System.NullReferenceException'

詳細情報:することができます」トン削除されたオブジェクト

私のクラスDbContextアクセス:

public static class DbContext 
{ 
    private static ISessionFactory _sessionFactory; 

    static DbContext() 
    { 
     GetFactory(); 
    } 
    public static void GetFactory() 
    { 
     var myEntities = new[] 
     { 
      typeof (ApplicationUser) 
     }; 
     var configuration = Fluently.Configure() 
       .Database(MsSqlConfiguration.MsSql2012.ConnectionString(c => c.FromConnectionStringWithKey("ConnectionString")) 
        .ShowSql()) 
       .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())) 
       .ExposeConfiguration(x => 
       { 
        x.SetProperty("", ""); 
        x.AddDeserializedMapping(MappingHelper.GetIdentityMappings(myEntities), null); 
       }) 
       .ExposeConfiguration(BuildSchema); 

     _sessionFactory = configuration.BuildSessionFactory(); 

    } 
    public static ISessionFactory SessionFactory() 
    { 
     return _sessionFactory; 
    } 

    public static ISession GetSession() 
    { 
     if (!CurrentSessionContext.HasBind(_sessionFactory)) 
      CurrentSessionContext.Bind(_sessionFactory.OpenSession()); 

     return _sessionFactory.GetCurrentSession(); 
    } 
    public static ISession MakeSession() 
    { 
     return _sessionFactory.OpenSession(); 
    } 
    //public static IUserStore<ApplicationUser, string> Users => new IdentityStore(MakeSession()); 

    private static void BuildSchema(Configuration config) 
    { 
     new SchemaUpdate(config) 
      .Execute(true, true); 
    } 

} 

を、助けてください! ありがとう!

+0

私見を、良いデザインではない静的なフィールドとして、セッションとトランザクションを持ちます。 OpenSession()とBeginTransaction()の呼び出しをAddCandidate()メソッドに追加してください。 –

答えて

0

SessionFactoryはシングルトンであり、それを静的なものとして使用することが解決策の一部となります。必要に応じてISessionITransactionのオブジェクトを作成する必要があります。あなたのコードがCandidatesプロパティにやっているようQueryableを公開する

public static readonly ISessionFactory SessionFactory = DbContext.SessionFactory(); 

public Candidate GetUser(int id) 
{ 
    Candidate candidate = null; 
    using (var session = SessionFactory.OpenSession()) 
    { 
     candidate = Session.Query<Candidate>().FirstOrDefault(x => x.Id == id); 
    } 
    return candidate;   
} 

public void AddCandidate(Candidate candidate) 
{ 
    using (var session = SessionFactory.OpenSession()) 
    { 
     using (var transaction = session.BeginTransaction()) 
     { 
      try 
      { 
       Session.Save(candidate); 
       transaction.Commit(); 
      } 
      catch 
      { 
       transaction.RollBack(); 
       throw; 
      } 
     } 
    } 
} 

避けてください:このような何かにあなたのコードを変更してみてください。

セッション管理をアプリケーションに正しく実装する方法がいくつかあり、実行可能な環境コードによって変更される可能性があります。

は、私はあなたがこれらの記事を参照してくださいすることをお勧めします: http://benfoster.io/blog/yet-another-session-per-request-post

How to implement session-per-request pattern in asp.net mvc with Nhibernate

+0

私はあなたのコードをテストしていますが、今は大変感謝しています! – Caycay