2017-10-19 25 views
0

Fluent NHibernate과 SQL Server로 데이터베이스를 설정했으며 SQL Server으로 정상적으로 작동했습니다. 매번 코드를 실행하면 데이터베이스 구조가 생성되고 데이터가 삽입되어 응용 프로그램 인터페이스가 완벽하게 작동합니다. 프로그램을 종료하면 데이터베이스와 컨텐트가 저장됩니다.Fluent NHibernate 로컬 mdf 파일이 테이블 구조를 유지하지 않음

데이터베이스를 SQL 서버에 설치하지 않으려 고합니다. 데이터베이스를 솔루션 파일 구조에 * .mdf 파일로 지정합니다. 그래서 설치 프로세스없이 응용 프로그램을 복사 할 수 있습니다.

이 항목의 문제와 이유는 솔루션 파일 구조에서 파일을 사용하면 응용 프로그램이 실행되는 동안 완벽하게 작동하지만 응용 프로그램을 닫으면 데이터가 모두 사라진다는 것입니다. 응용 프로그램을 다시 시작하면 삽입 한 데이터가 사라집니다.

내 클래스는 SQL 서버에 대해 다음과 같다 :

.ConnectionString(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename="+AppDomain.CurrentDomain.BaseDirectory+ "General\\Data\\MyDatabase.mdf" + ";Integrated Security=True;") 

이/커밋 데이터베이스에 데이터를 유지하려면 : 로컬 파일의 경우

class NHibernateHelper 
{ 
    private static ISessionFactory _sessionFactory; 

    private static ISessionFactory SessionFactory 
    { 
     get 
     { 
      if (_sessionFactory == null) 
       InitializeSessionFactory(); 

      return _sessionFactory; 
     } 
    } 

    private static void InitializeSessionFactory() 
    { 
     _sessionFactory = Fluently.Configure() 
      .Database(
       MsSqlConfiguration.MsSql2012 
       .ConnectionString(@"server=MyComputer;Database=MyDatabase;Trusted_Connection=true;") 
       .ShowSql()) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<MyEntity>()) 
      .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(true, true)) 
      .BuildSessionFactory(); 
    } 

    public static ISession OpenSession() 
    { 
     return SessionFactory.OpenSession(); 
    } 
} 

, 난 그냥 ConnectionString을 줄을 변경 다음 구조를 사용합니다 :

 using (var session = NHibernateHelper.OpenSession()) 
     { 
      using (var transaction = session.BeginTransaction()) 
      { 

       var newEntity = new EntEntity 
       { 
        //Data to populate 

       }; 

       session.SaveOrUpdate(newEntity); 
       transaction.Commit(); 

       if (transaction.WasCommitted) 
       { 
        MessageAndCleanInterface("Sucessful created!"); 
       } 
      } 
     } 

이 일이 일어나는 이유를 아는 사람 있습니까? 이 시점에서 다른 유형의 데이터베이스 유형을 사용하더라도 다른 유형의 테스트를 시작하겠습니다. 그럼에도 불구하고 나는이 이유를 알고 싶다.

+0

삽입물에 트랜잭션을 사용 했습니까? – Rabban

+0

'SessionFactory' 생성 코드에서'new SchemaUpdate (cfg) .Execute (true, true)'라는 줄을 사용하면'SessionFactory'가 생성 될 때마다 깨끗한 스키마를 얻으실 수 있습니다. 매번이 작업을 수행 할 필요는 없습니까? –

+0

@Rabban 귀하의 질문에 더 잘 답변하기 위해 내 게시물을 편집했습니다. 재시작, 네, 저는 세션 객체 내부에서 트랜잭션을 시작하고 마지막에 커밋을합니다. – Nuno

답변

1

Visual Studio는 모든 빌드에서 .mdf를 덮어 씁니다. new를 빌드하지 않고 .exe 파일 만 시작하면 데이터가 지속됩니다.