2009-01-15 12 views
38

में कंपोजिट कुंजी मैपिंग मैं एनएचबीरनेट के लिए नया हूं। अब मुझे समग्र कुंजी मैपिंग के साथ एक समस्या का सामना करना पड़ता है। क्या कोई यूआरएल या नमूना बता सकता है?फ़्लुएंट एनएचबेर्नेट

+0

यहाँ http://devlicio.us/blogs/derik_whittaker/archive/2009/01/16/using-fluentnhibernate-to-map-composite-keys-for-a-table अधिक विस्तृत उदाहरण मिल सकता है .aspx –

उत्तर

48

CompositeId विधि है।

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     CompositeId() 
     .KeyProperty(x => x.Something) 
     .KeyReference(x => x.SomethingElse); 
    } 
} 
+17

ध्यान दें कि NHibernate UseCompositeId के नए संस्करणों में CompositeId के साथ प्रतिस्थापित किया गया है, और WithKeyProperty केवल KeyProperty –

+2

@Rob Walker: साथ ही ReRferenceProperty KeyReference – Mulki

+4

इस मामले में KeyProperty और KeyReference में क्या अंतर है? –

5

अगर यह आपके प्रथम श्रेणी

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
    UseCompositeId() 
     .WithKeyProperty(x => x.Something) 
     .WithReferenceProperty(x => x.SomethingElse); 
    } 
} 
यहाँ

है इकाई

पर एक संदर्भ के साथ दूसरे स्थान पर है
public class SecondEntityMap : ClassMap<SecondEntity> 
    { 
     public SecondEntityMap() 
     { 
     Id(x => x.Id); 

     .... 

     References<Entity>(x => x.EntityProperty) 
      .WithColumns("Something", "SomethingElse") 
      .LazyLoad() 
      .Cascade.None() 
      .NotFound.Ignore() 
      .FetchType.Join(); 

     } 
    } 
1

समग्र पहचानकर्ता, संस्थाओं है कि नक्शे के साथ संस्थाओं के लिए की आवश्यकता हो सकती है उन टेबलों के लिए जिनमें कई प्राथमिक स्तंभ हैं, जो कई स्तंभों से बना है। इस प्राथमिक कुंजी को बनाने वाले कॉलम आमतौर पर अन्य तालिकाओं के लिए विदेशी कुंजी होते हैं।

public class UserMap : ClassMap<User> 
{  
    public UserMap() 
    { 
     Table("User"); 

     Id(x => x.Id).Column("ID"); 

     CompositeId() 
      .KeyProperty(x => x.Id, "ID") 
      .KeyReference(x => x.User, "USER_ID"); 

     Map(x => x.Name).Column("NAME");    

     References(x => x.Company).Column("COMPANY_ID").ForeignKey("ID"); 
    } 
} 

अधिक संदर्भ के लिए: http://www.codeproject.com/Tips/419780/NHibernate-mappings-for-Composite-Keys-with-associ

+1

के लिए कीरफरेंस का उपयोग करें "इस प्राथमिक कुंजी को बनाने वाले कॉलम आमतौर पर अन्य तालिकाओं के लिए विदेशी कुंजी होते हैं।" नहीं, आमतौर पर नहीं। यदि कुछ भी हो, तो वे एक इकाई को विशिष्ट रूप से पहचानने में मदद करते हैं जहां एक कॉलम स्वयं ऐसा करने में विफल रहता है। – user919426

2

नोट करने के लिए एक और बात है कि आप एक CompositeId का उपयोग कर एक इकाई के लिए बराबर है और GetHashCode तरीकों को ओवरराइड चाहिए। स्वीकार किए गए उत्तर मैपिंग फ़ाइल को देखते हुए, आपकी इकाई इस तरह दिखेगी।

public class Entity 
{ 
    public virtual int Something {get; set;} 
    public virtual AnotherEntity SomethingElse {get; set;} 


    public override bool Equals(object obj) 
    { 
     var other = obj as Entity; 

     if (ReferenceEquals(null, other)) return false; 
     if (ReferenceEquals(this, other)) return true; 
     return other.SomethingElse == SomethingElse && other.Something == Something; 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      return (SomethingElse.GetHashCode()*397)^Something; 
     } 
    } 

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