2011-05-04 1 views
32

Fluent Nhibernate를 사용하여 데이터베이스를 만드는 어플리케이션이 있습니다. 지금까지 매번 데이터베이스 스키마를 다시 만들었습니다.Fluent NHibernate - 데이터베이스 스키마가 존재하지 않을 경우에만 생성

public NhibernateSessionFactory(IPersistenceConfigurer config) 
{ 
    _sessionFactory = Fluently.Configure(). 
     Database(config). 
     Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()). 
     ExposeConfiguration(BuildSchema). 
     BuildSessionFactory(); 
} 

private static void BuildSchema(Configuration config) 
{ 
    // if (DbExists(config)) 
    // return; 

    new SchemaExport(config).Create(false, true); 
} 

참고 "if (DbExists(config))":이 작업을 수행하는 코드는 다음입니다. 이것이 제가하고 싶은 것입니다. 실제로 존재하지 않는 경우에만 스키마를 만들고 싶습니다. 그리고 다음 단계에서 최신이 아닌 경우 을 업데이트하려고합니다.

어떻게해야합니까? 내가 config.DatabaseExists()을 기대하지만, 나는 이런 것을 볼 수 없다. 해킹 된 솔루션의 가능성을 알 수 있지만이를 처리하는 일반적인 권장 방법은 무엇입니까?

답변

67

당신은 존재하는 경우는 스키마를 업데이트 할 것입니다, 대신 SchemaUpdate를 사용하고 그렇지 않은 경우를 만들 수 있습니다

public NhibernateSessionFactory(IPersistenceConfigurer config) 
{ 
    _sessionFactory = Fluently.Configure(). 
     Database(config). 
     Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()). 
     ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true)). 
     BuildSessionFactory(); 
} 

한 가지주의 : SchemaUpdate하지 않습니다 파괴적인 업데이트 (테이블, 컬럼 등 삭제). 그것은 단지 그들을 추가 할 것입니다.

+0

환상적! 이것은 내가 찾고 있었던 바로 그 것이다. 감사! – stiank81

+0

완벽! 감사 – Bronek

9

업데이트] (감사 dotjoe는)

hbm2ddl을 스키마 diff 명령을하고 만들 SchemaUpdate 클래스와 변경된 내용을 업데이트 만 할 수 있습니다. 그러나이 클래스는 현재 엔티티와 스키마가 다른 점만 살펴 보는 점에서 매우 초보적입니다. 중요한 변경 사항이있는 경우 (즉, 제거 된 엔티티 또는 링크 테이블이 제거 된 경우)이를 파악할 수 없습니다.

이전 프로젝트에서는 hbm2ddl을 사용했지만 이후 Fluent Migrator를 사용했습니다. 가장 좋은 방법은 Fluent Migrator 또는 Migrator.NET과 같은 마이그레이션 도구를 사용하는 것입니다.

http://github.com/schambers/fluentmigrator/

http://code.google.com/p/migratordotnet/

+0

실제로 Hbm2ddl은'SchemaUpdate'를 사용하여 변경 스크립트를 생성 할 수 있지만 모든 것을 포착하지는 않으며 절대 사용하지 않을 것입니다. – dotjoe

+0

@dotjoe 당신이 방금 파괴적인 업데이트를하지 않는다는 사실을 언급하고 있습니까? 프로덕션 환경에서 SchemaUpdate를 사용하고 뭔가 잡히지 않는 데 문제가 없었습니다. –

+0

@Gabe Moothart는 열 Null 기능과 같은 변경 사항을 catch하지 않지만 Null 열에서 Null 열로 이동하면 파괴적인 변경으로 간주됩니다. – dotjoe

관련 문제