2016-12-27 102 views
0

我有一個問題,保存多個項目數據庫在C#asp.net與流利的nhibernate。我有:AdoTransaction - isolationlevel爲空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的對象。嘗試更改您的代碼是這樣的:

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; 
      } 
     } 
    } 
} 

避免暴露Queryable爲你的代碼是在Candidates財產做。

有一些方法可以正確地在應用程序上實現會話管理,並根據whant環境代碼的執行情況進行更改。

我建議你看到這些帖子: 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