2016-12-27 4 views
0

나는 유창한 nhibernate를 가진 C# asp.net에있는 데이터베이스에 하나 이상의 항목을 저장하는 데 문제가있다.AdoTransaction - isolationlevel is 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; 
     } 

    } 

그리고 오류는 다음과 같습니다 : 나는이 = '((NHibernate.Transaction.AdoTransaction) 거래) .IsolationLevel는'System.NullReferenceException '

더 많은 정보 유형의 예외를 IsolationLevel 던졌다 : 수' t는 삭제 된 개체를

내 클래스 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 재산에서 수행되고으로

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를 노출 할 수 있습니다.

응용 프로그램에서 세션 관리를 올바로 구현하는 몇 가지 방법이 있으며, 변경 될 수있는 환경 코드가 실행되면 이에 따라 달라집니다.

나는 당신이이 글을보고 추천 : 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