2009-03-23 17 views
31

के साथ काम कर रहे फ्लुएंट एनएचबर्ननेट, मैंने अभी फ्लुएंट एनएचबेर्नेट पर स्विच किया है और मुझे एक समस्या आई है और इसके बारे में कोई जानकारी नहीं मिली है।इंटरफेस

यहाँ मामला है:

public class Field : DomainObject, IField 
{ 
    public Field() 
    { 
    } 

    public virtual string Name { get; set; } 
    public virtual string ContactPerson { get; set; } 
    public virtual bool Private { get; set; } 
    public virtual IAddress Address { get; set; } 
} 

IAddress एक वर्ग नामित पता द्वारा कार्यान्वित एक अंतरफलक है

public class Address : DomainObject, IAddress 
{ 
    public Address() 
    { 
    } 

    public virtual string City { get; set; } 
    public virtual string Country { get; set; } 
    public virtual string PostalCode { get; set; } 
    public virtual string StreetAddress { get; set; } 
} 

यहाँ दोनों वर्गों के लिए मेरे मानचित्रण फ़ाइलें

ADDRESS

public class AddressMap : ClassMap<Address> 
{ 
    public AddressMap() 
    { 
     WithTable("Addresses"); 
     Id(x => x.Id, "Id").Access.AsCamelCaseField(Prefix.Underscore).GeneratedBy.Guid(); 
     Map(x => x.City, "City"); 
     Map(x => x.Country, "Country"); 
     Map(x => x.PostalCode, "PostalCode"); 
     Map(x => x.StreetAddress, "StreetAddress"); 
    } 
} 

क्षेत्र

public class FieldMap : ClassMap<Field> 
{ 
    public FieldMap() 
    { 
     WithTable("Fields"); 
     Id(x => x.Id, "Id").Access.AsCamelCaseField(Prefix.Underscore).GeneratedBy.Guid(); 
     Map(x => x.Name, "Name"); 
     Map(x => x.ContactPerson, "ContactPerson"); 
     Map(x => x.Private, "Private"); 
     References(x => x.Address, "AddressId").Cascade.Delete().Cascade.SaveUpdate(); 
    } 
} 

तो जब मैं अपने डेटाबेस से कोई फ़ील्ड वस्तु पुनर्प्राप्त करने की कोशिश की, मैं एक NHibernate त्रुटि कहा गया है कि कि IAddress मैप नहीं है मिलता है। मैपिंग में पता वर्ग का उपयोग करने के लिए एनएचबीर्नेट को निर्दिष्ट करने का कोई तरीका है?

यदि अधिक जानकारी की आवश्यकता है तो कृपया मुझे बताएं।

धन्यवाद एक बहुत,

चार्ल्स

+0

आप डेटाबेस में IAddress पदानुक्रम का मॉडल कैसे कर रहे हैं? टेबल-प्रति-पदानुक्रम (एक सारणी जिसमें सभी प्रकार के पते होते हैं), या टेबल-प्रति-कंक्रीट-क्लास? आपने कहा कि आपने फ्लुएंट पर स्विच किया है, इसलिए एक उदाहरण पोस्ट करना एक्सएमएल मैपिंग यह निर्धारित करने में मदद कर सकता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। –

+0

असल में मैंने एडीओ.NET इकाई फ्रेमवर्क से फ्लुएंट एनएचबेर्नेट के साथ निबर्ननेट में स्विच किया। मेरे डेटाबेस में, एक सारणी है जिसमें सभी प्रकार के पते होते हैं। वैसे, मैंने उन इंटरफेस को हटाने का फैसला किया, मुझे एहसास हुआ कि यह बेकार था। लेकिन मुझे लगता है कि सवाल अभी भी वैध है। धन्यवाद, चार्ल्स –

उत्तर

35

मुझे लगता है कि एक संपत्ति के रूप में एक ठोस वर्ग के बजाय इंटरफेस का उपयोग करने के वैध कारण हैं।

उदाहरण के लिए, यदि आपकी फील्ड क्लास पता वर्ग में एक अलग परियोजना में थी, और आपके पास फ़ील्ड क्लास की परियोजना से पता श्रेणी की परियोजना पर निर्भरता नहीं थी।

इस स्थिति से निपटने के अन्य तरीके हैं, लेकिन आप जो भी कर रहे हैं उसका प्रयास करने का सबसे आसान तरीका अक्सर होता है और स्पष्टीकरण एनएबीबर्ननेट को कंक्रीट क्लास को IAddress के लिए उपयोग करने के लिए बताता है।

अब आप इस तरह धाराप्रवाह NHibernate में ऐसा कर सकते हैं,:

References(x => x.Address, "AddressId") 
    .Class(typeof(Address); 

दुर्भाग्य से आप HasMany या HasManyToMany के साथ ऐसा नहीं कर सकते। मुझे यकीन नहीं है कि सी # में अच्छे कॉन्वर्सिस समर्थन की कमी के कारण यह भी संभव होगा।

+26

** अद्यतन: ** आप 'संदर्भ

(x => x.Address) .Column (" AddressId ") का उपयोग कर सकते हैं;' आप 'HasMany' और 'HasManyToMany' के साथ भी ऐसा कर सकते हैं सामान्य प्रकार पैरामीटर जोड़कर। अद्यतन के लिए – Jay

+0

+1, बस जो मैं खोज रहा था, बहुत धन्यवाद। – 4imble

+0

बहुत बहुत धन्यवाद, ठीक वही मैं जो भी ढूंढ रहा था ... करने की कोशिश की। कोलेक्शन टाइप() ने मेरे HasMany() पर जंजीर लगाया, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा था। अद्यतन के लिए – calebt

5

अपने फील्ड वस्तु पर, आप प्रकार IAddress का एक उद्देश्य है। इसे किसी भी विभिन्न कार्यान्वयन द्वारा लागू किया जा सकता है। आप जो पूछ रहे हैं उसके साथ, प्रत्येक कार्यान्वयन में अपना मैपिंग होगा, जो एनएचबीर्नेट को संभालने के लिए किसी भी कठिनाइयों (असंभवताओं?) पेश करेगा।

एक साधारण उदाहरण प्रदर्शित करने में मदद करेगा। मान लें कि आपके पास दो IAddress कार्यान्वयन पता 1, और पता 2 है। वे प्रत्येक अपनी मेज, tblAddress1, और tblAddress2 में सहेजे जाते हैं। जब आप अपनी फील्ड ऑब्जेक्ट को लोड करने का प्रयास करते हैं, तो सभी NHibernate जानता है कि आपके पास कुछ ऐसा है जो IAddress लागू करता है, यह नहीं जानता कि कौन सा कार्यान्वयन जारी रखा गया था। किसी भी दिए गए फ़ील्ड के लिए बच्चे ऑब्जेक्ट को पुनर्प्राप्त करने के लिए किस मैपिंग का उपयोग करना है, यह कैसे पता चलेगा?

मुझे यकीन है कि और अधिक जटिलताएं हैं, लेकिन यह उदाहरण दिखाता है कि आपको सटीक प्रकार के ऑब्जेक्ट के लिए मैपिंग क्यों करना है जिसे आपने घोषित किया है।

0

यदि आप अपने ओआरएम को पूरी तरह से अपने डोमेन परत से डीकॉप्लिंग करने में रुचि रखते हैं, और कंक्रीट कक्षाओं को निर्दिष्ट करने के बजाय अपनी डेटा परत में इंटरफेस का संदर्भ देते हैं, तो आप दोनों के बीच मैप करने के लिए एक एम्प्टीइंटरसेप्टर को कार्यान्वित कर सकते हैं।

मेरा उत्तर here देखें।

संबंधित मुद्दे