2010-02-18 28 views
5

ICustomer arabirimini uygulayan iki sınıf NiceCustomer & RoughCustomer kullanıyorum.Nhibernate'de bir arabirim nasıl eşlenir?

ICustomer, dört özelliğe sahiptir. Bunlar:

  1. Property Id() As Integer
  2. Property Name() As String
  3. Property IsNiceCustomer() As Boolean
  4. ReadOnly Property AddressFullText() As String

Ben veritabanına, arayüz ICustomer haritası nasıl bilmiyorum.

İç istisnada böyle bir hata alıyorum.

bir ilişki eşlenmemiş bir sınıfını ifade eder: ICustomer

akıcı ve NHibernate kullanıyorum

.

+0

Herhangi bir arabirimi böyle eşleştirmeniz gerektiğini sanmıyorum .. Haritalama dosyalarınızı gönderebilir misiniz? Teşekkürler –

+0

Mahesh'e yanıt verdiğiniz için teşekkür ederiz. Ama Kevin'ın nhibernate'de bir arayüzü eşleyemeyeceğimizi söylediği gibi. Arayüzü bir temel sınıf olarak değiştirdim. – Josh

cevap

0

Nhibernate'de bir arabirimi eşlemek mümkün değildir. Amacınız, her iki türden müşteriyi almak için ortak bir tür kullanarak sorgulayabilmekse, bir polimorfik sorgu kullanabilirsiniz. Her iki sınıfın da arayüzü uygulayıp sınıfları normal olarak haritalamasını sağlayın.

https://www.hibernate.org/hib_docs/nhibernate/html/queryhql.html (bölüm 11,6)

+0

Ben de polimorfik sorguyu denedim ama işe yaramıyor. Hala bu eşlenmemiş arayüz müşterisi ile sorun vardı. Bu yüzden şimdi iyi bir temel sınıf yaptı. Çok teşekkürler Kevin. – Josh

+0

"Bir adlandırılmış kalıcı sınıfın bir arabirim olması mükemmel bir şekilde kabul edilebilir. Daha sonra, öğesini kullanarak bu arabirimin sınıflarını uygulama bildirirsiniz." http://knol.google.com/k/fabio-maulo/nhibernate-chapter-5-basic-o-r-mapping/1nr4enxv3dpeq/8# – Neal

+3

Bu bağlantıdaki bağlantı bozuk. Lütfen bağlantıyı güncelleyin veya cevabınıza daha fazla ayrıntı ekleyin. –

0

nasıl sorguladığınız: Bu referansına bakın? Eğer HQL kullanıyorsanız, bu hat ile HBM dosyası ile arabirimin ad almak gerekir: Eğer Kriterleri kullanıyorsanız

<import class="name.space.ICustomer, Customers" /> 

sadece ICustomer sorgulamak gerekir ve her iki müşteri dönersiniz türleri.

bunun bir müşteri olan bir sınıf haritalama ediyorsanız ya bir hasMany, HasManyToMany veya Kaynaklar o zaman genel formunu kullanmak gerekir yoluyla: Eğer o da baş etmek istiyorsanız

References<NiceCustomer>(f=>f.Customer) 

, bunları alt sınıfların yapmak gerekir

ben temel sınıf Müşteri ihtiyaç ve dış sınıfta genel tür parametresi için bu kullanacağız düşünüyorum hangi durumda
Subclassmap<NiceCustomer> 

:

References<Customer>(f=>f.Customer) 

Yine de, bununla başa çıkmak için etki alanı modelinizi değiştirmemelisiniz, dış sınıfa hala bir ICustomer sahip olmalıdır.

1.0RTM'nin Genel formu Referanslar için çalışıyor mu, ancak değişikliklerin hızlı bir şekilde taranmasının iki satırlık bir ek olduğunu düşündüğüm değişikliği göstermesi gerektiğinden emin değilim.

3

, NHibernate'deki arabirimlere doğrudan, yapılandırma aşamasında bir BoşIçalışmayı takarak.Bu engelleyicinin işi, eşleme dosyalarınızda tanımladığınız arayüzlere uygulamalar sağlamak olacaktır.

public class ProxyInterceptor : EmptyInterceptor 
{ 
    public ProxyInterceptor(ITypeHandler typeHandler) { 
     // TypeHandler is a custom class that defines all Interface/Poco relationships 
     // Should be written to match your system 
    } 

    // Swaps Interfaces for Implementations 
    public override object Instantiate(string clazz, EntityMode entityMode, object id) 
    { 
     var handler = TypeHandler.GetByInterface(clazz); 
     if (handler == null || !handler.Interface.IsInterface) return base.Instantiate(clazz, entityMode, id); 
     var poco = handler.Poco; 
     if (poco == null) return base.Instantiate(clazz, entityMode, id); 

     // Return Poco for Interface 
     var instance = FormatterServices.GetUninitializedObject(poco); 
     SessionFactory.GetClassMetadata(clazz).SetIdentifier(instance, id, entityMode); 

     return instance; 
    } 

} 

Bundan sonra, tüm ilişkiler ve eşleştirmeler arabirimler olarak tanımlanabilir.

public Parent : IParent { 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public IChild Child { get; set; } 
} 

public Child : IChild { 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public class ParentMap : ClassMap<IParent> 
{ 
    public ParentMap() 
    { 
     Id(x => x.ID).GeneratedBy.Identity().UnsavedValue(0); 
     Map(x => x.Name) 
    } 
} 

... 

tüm yapılandırmayı yerleştirerek, ORM gerçek ayrılmasını sağlamak istiyorsanız tekniğin Bu tip büyük/ayrı projede eşleştirmeleri ve sadece referans arabirimleri. Etki alanı katmanınız daha sonra ORM ile kirlenmez ve gerekiyorsa daha sonra bunu değiştirebilirsiniz.

+0

Yapılandırmada ProxyInterceptor'ı kullanarak bir örnek ekleyebilir misiniz? Ben şimdi Fluent Nhibernate kullanmaya başlıyorum ve proxy'yi nerede belirteceğimi bilmek için yapılandırma kısmına yeterince aşina değilim ... –

+0

Çalışmayı başarabiliyordum ama sorun şu ki Domain tabakası hala aşırı derecede kirleniyor ORM'ye özgü yöntemler - öncelikli olarak özelliklerdeki ayarlayıcılar. ORM, her nesnede bir değer ayarlayabilmeli, Etki Alanı nesnesinde bir nesnenin Kimlik alanını değiştirmeyi mümkün kılmak istemiyorum (diğer salt okunur özelliklerle aynı). –

İlgili konular