2010-04-16 26 views
9

Projemin üç veritabanını ele alması gerekiyor, bu da üç oturum fabrikası anlamına geliyor. i akıcı nhibernate ile böyle bir şey yaparsak şey şudur: Bütün eşleşmeleri alacağınıFluent NHibernate + çoklu veritabanları

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())) 

fabrikalar, başka veritabanına karşılık bile olanlar

gördüğüm sizi automapping kullanırken o ad tarafından böyle bir şey, ve filtreyi yapabilirsiniz: Ben akıcı eşleştirmeleri için böyle bir şey sığınak bulundu

.Mappings(m => m.AutoMappings.Add(
    AutoMap 
     .AssemblyOf<Product>() 
     .Where(t => t.Namespace == "Storefront.Entities"))) 

, bu mümkün ?? Düşünebildiğim tek çözüm: ya her db haritalama sınıfı için ayrı montajlar oluşturmak ya da varlıkların her birini fabrika konfigürasyonuna açıkça eklemek.

Mümkünse her ikisinden de kaçınmayı tercih ederim. Teşekkürler.

+2

Bu örnekte her veritabanı için bir eşleme derlemesi öneririm. Bu, endişelerin iyi bir şekilde ayrılması ve diğer geliştiricilerin anlaması için kolay olmalıdır. –

+0

Tüm varlık sınıflarını başka bir projeye ve diğer proje için ikinci db'ye koymam gerekiyor gibi görünüyor. – CallMeLaNN

cevap

5

ben varlık aittir DB hangi dikte Akıcı eşleme dosyasının tam olarak bu kullanarak (kendi) Özellik uyguladık. Ben de bir kavram var bir 'varsayılan' veritabanı ve bir özniteliği olmayan dosyaları eşleme varsayılan DB'de (varsa, süslemeniz gereken sınıfların sayısını azaltabilir) olduğu varsayılır. Daha sonra, her veritabanı için bir Oturum Fabrikası oluşturan başlatma kodu var ve her biri için, tüm ClassMap sınıflarını bulmak için yansıma kullanır, özniteliği, hangi DB'ye ait olduğunu belirlemek için inceler ve her bir ClassMap'i buna göre kaydeder.

bir eşleme dosyası örneği:

[FluentNHibernateDatabase("MySecurityDatabase")] 
    public class SystemUserMap : ClassMap<SystemUser> 
    { 
    public SystemUserMap() 
    { 
     Id(x => x.SystemUserId); 
     Map(x => x.LoginId); 
     Map(x => x.LoginPassword); 
     Map(x => x.UserFirstName); 
     Map(x => x.UserSurname); 
     References(x => x.UserOrganisation, "OrganisationId"); 
    } 
    } 

Açıkçası ben/başvurulan kullanılan veritabanları listesini tanımladık. How to identify a particular entity's Session Factory with Fluent NHibernate and Multiple Databases

+3

Bu senaryoda, özniteliği nereden kullanıyorsunuz? Eşleme yapılandırmasında olacağını biliyorum, ancak uygulamanızın daha fazla detayını sağlayabileceğiniz herhangi bir şans var mı? Teşekkürler! – reallyJim

+0

FluentNHibernateDatabase özniteliği ve Fluently.Configure() öğesini nasıl tanımlarsınız? – CallMeLaNN

+0

Öznitelik benim ve ben belirli bir sınıfın kaydedilmesi gereken DB'yi tanımlamak için kullanıyorum (özniteliğin parametresi DB'm için verdiğim addır). 'Varsayılan' DB'yi düşündüğüm şeye sahibim ve bu DB'deki varlıklar ile ilgili olan tüm Harita dosyalarının özniteliğe ihtiyacı yoktur (veya tersine: özniteliksiz tüm harita dosyalarının amaçlandığı varsayılır. varsayılan DB). – Trevor

1

Ayrıca türlere göre filtreleyebilirsiniz. İşte bir "yeşil alan" AutoPersistenceModel 'in "kahverengi alan bir" (yani, iki veritabanı) ile aynı montajda kullandığım bir yorumlanmış kod satırı. Ama filtrelemem gereken tek bir tip var, bu yüzden eski bir meclisi ayırmaktan rahatsız olmadım. Eğer db başına bir sürü varsa o zaman bunları meclislerle bölmek muhtemelen en iyi IMO olacaktır.

Eğer FNH bir çeşit çoklu db desteği sağlayabilirse çok iyi olurdu ama bunun nasıl yapılacağını bilmiyorum; SessionFactories'in bir çeşit sözlüğü belki ama her durum sadece çok eşsiz.

HTH,
Berryl

/// <summary> 
    /// This would simply call <see cref="AutoMapHelpers.GetAutoMappingFilter"/> but we need to 
    /// exclude <see cref="LegacyProject"/> also for now. 
    /// </summary> 
    private static bool _getIncludedTypesFilter(Type t) { 
     return _isNotLegacy(t) && AutoMapHelpers.GetAutoMappingFilter(t); 
    } 
    private static bool _isNotLegacy(Type t) { return !t.Equals(typeof(LegacyProject)); } 
4

: Sorumu burada sordunuz

: (Birisi ile yardımcı olabilir umut)
My uygulaması şimdiye kadar bunu geçtiniz olarak çalışıyor, ancak bir pürüz çıktı ettik bunu yapmanın kolay yolu Sonra Şeması

içine veritabanı adını koymaktır, bütün tablolar aynı bağlantı dizesi erişilebilir koşuluyla, tek bir oturum fabrikası ihtiyaç

0

Çok geç yanıt olsa da, infazın çözülmesi gereken bir çözümü olan aşağıdaki URL'yi uygulamanızı öneririm ve böylece çözümü yanıtlarda bulabilirsiniz. Here sadece bugün itibariyle veritabanı ilk modeli uygulayabilirsiniz bana uyguladığı çözümle url

yardımıyla uygulanan cevabınıza çözümdür. Söz konusu url'de bana gönderilen soruda GenerateSchema yönteminden kaçınmayı deneyin, çünkü bu yöntemi kullandığınız halde hala uygulanmadığı için, aynı tablo ve ilişkilerle oluşturulan birden çok veritabanını görebileceksiniz.

İlgili konular