2011-05-04 20 views
32

Veritabanımı oluşturmak için Fluent Nhibernate kullandığım bir uygulama var. Şimdiye kadar veritabanı şemasını her seferinde yeniden oluşturdum.Fluent NHibernate - Yalnızca mevcut değil ise veritabanı şeması oluştur

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

Not "if (DbExists(config))": bunu yapar kod budur. Yapmak istediğim şey bu. Şemayı gerçekten var olmadıysa oluşturmak istiyorum. Ve bir sonraki adımda - güncel değilse, 'u güncellemek istiyorum.

Bunu nasıl başarabilirim? Bir config.DatabaseExists() bekliyorum, ancak böyle bir şey göremiyorum. Hayal kırıklığına uğramış bir çözümün bazı olasılıklarını görüyorum, ancak bunu işlemenin tipik yolu nedir?

cevap

67

sadece varsa o şema güncellenir yerine SchemaUpdate kullanmak ve bunları yapmazsa bunu oluşturabilirsiniz:

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

Bir ihtar: SchemaUpdate değil yıkıcı güncellemeler yapın (tabloları, sütunları, vb. bırakarak). Sadece onları ekleyecektir.

+0

Fantastik! Tam olarak aradığım şey bu. Teşekkürler! – stiank81

+0

Mükemmel! Teşekkürler – Bronek

9

GÜNCELLEME (teşekkürler dotjoe)

Hbm2ddl bir şema diff yapıyor ve sadece SchemaUpdate sınıf ile nelerin değiştiğini güncellenmesi sadece yeteneğine sahiptir. Bununla birlikte, bu sınıf, şu andaki varlıklara ve şemanın nasıl farklılaştığına bakması bakımından oldukça ilkeldir. Eğer önemli değişiklikler yapıldıysa (yani kaldırılan veya tabloları çıkarılmış olan), bunu anlayamayacaksınız.

Daha önceki bir projede hbm2ddl kullandık, ancak o zamandan beri Fluent Migrator'ı kullanmaya başladık. En iyi bahsinizin Fluent Migrator veya Migrator.NET gibi bir geçiş aracını kullanmak olduğunu söyleyebilirim.

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

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

+0

aslında Hbm2ddl, "SchemaUpdate" ile komut dosyaları oluşturabilir ... ancak, her şeyi yakalamaz ve asla güvenmem. – dotjoe

+0

@dotjoe sadece yıkıcı güncellemeler yapmadığı gerçeğinden bahsediyor musunuz? SchemaUpdate'i üretimde kullanıyorum ve bir şeyleri yakalamamasıyla hiç bir problemim olmadı. –

+0

@Gabe Moothart, sütun boşluğu yeteneği gibi değişiklikleri yakalayamaz, ancak boş sütundan null olmayan sütuna taşınırsa, bu durum yıkıcı bir değişiklik olarak kabul edilir. – dotjoe

İlgili konular