2009-07-20 10 views
12

क्या डेटाबेस द्वारा प्रबंधित कक्षा ऑटो वृद्धि की पूर्णांक संपत्ति हो सकती है लेकिन प्राथमिक कुंजी नहीं है (या आईडी को एनबीबर्ननेट उन्हें संदर्भित करता है)? मुझे यह कैसे करना है इसके उदाहरण खोजने में परेशानी हो रही है। किसी भी सहायता की सराहना की जाएगी। धन्यवाद।धाराप्रवाह निबर्ननेट ऑटो वृद्धि नॉन कुंजी (आईडी) संपत्ति

उत्तर

9

दो विकल्प।

  • यदि डेटाबेस इस तुम सिर्फ NHibernate बताने के लिए है कि संपत्ति उत्पन्न होता है और किसी भी अद्यतन/isnerts में शामिल करने की जरूरत नहीं है के लिए 100% जिम्मेदार है। नकारात्मकता यह है कि एनएच को स्मृति में ताजा मूल्य रखने के लिए अतिरिक्त चयन करने की आवश्यकता होगी।

    < संपत्ति नाम = "फू" = "हमेशा" अद्यतन = "false" डालने उत्पन्न = "false" />

  • यदि डेटाबेस ज़िम्मेदार नहीं है और तुम सिर्फ यह अपने आप आपके कर सकते हैं किया है चाहता हूँ किसी प्रविष्टि पर मान को 1 पर सेट करने के लिए एक इंटरसेप्टर का उपयोग करें और इसे अद्यतन पर 1 तक बढ़ाएं।

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors (11,1 - Interceptors)

आप OnSave() संपत्ति खोजने के लिए और प्रारंभिक मूल्य निर्धारित करने के लिए ओवरराइड कर देगा और उसके बाद OnFlushDirty ओवरराइड() संपत्ति संपत्ति और वेतन वृद्धि खोजने के लिए।


संपादित करें:

मैं एक बेवकूफ हूँ, नोटिस नहीं किया था आप धाराप्रवाह NHibernate कहा।


# 2 संपादित करें:

मुझे लगता है कि आप भी एक संस्करण के रूप में इस स्तंभ का उपयोग में रुचि हो सकती?

< version name="Foo" generated="always" /> 
+1

चिंता न करें, यह लगभग वही है। मानचित्र (x => x.Foo)। केवल पढ़ने()।SetAttribute ("जेनरेट", "हमेशा"); सेटएट्रिब्यूट जेनरेटेड द्वारा प्रतिस्थापित किया जाएगा। हमेशा जब हम 1.0 दबाते हैं। –

+0

मैंने नवीनतम एफएनएच डाउनलोड किया और पैरामीटर नहीं ले रहा है .Update() द्वारा उलझन में था। मुझे यकीन नहीं था कि मैपिंग में क्या होगा। केवल पढ़ने के लिए() समझ में आता है। – anonymous

5

यह मेरे लिए काम करता है:

public class Potato 
{ 
    public virtual Guid Id { get; protected set; } 
    public virtual int LegacyId { get; protected set; } 
} 

public class PotatoMap : ClassMap<Potato> 
{ 
    public PotatoMap() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.LegacyId).CustomSqlType("INT IDENTITY(1,1)").Not.Nullable().ReadOnly().Generated.Insert(); 
    } 
} 

असल में, पूर्णांक डेटाबेस द्वारा उत्पन्न होना तय है और NHibernate आवेषण पर इसे पुनः प्राप्त करने के निर्देश दिए है।

यह ध्यान रखना महत्वपूर्ण है कि मैपिंग उत्तर का केवल आधा है, और काम नहीं करेगा यदि कॉलम पहचान के रूप में नहीं बनाया गया है। कस्टम एसक्लटाइप स्कीमाएक्सपोर्ट के साथ तालिकाओं को उत्पन्न करते समय उचित एसक्यूएल बनाने के उद्देश्य से मैपिंग में जोड़ा गया है। यह उत्पन्न एसक्यूएल है:

create table [Potato] (
     Id UNIQUEIDENTIFIER not null, 
     LegacyId INT IDENTITY(1,1) not null, 
     primary key (Id) 
    ) 

दूसरी ओर, केवल पठनीय और Generated.Insert() NHibernate बता देंगे कि मूल्य केवल आवेषण पर डेटाबेस से स्वतः जेनरेट की है, और इसलिए इसके लिए डेटाबेस क्वेरी करने के लिए है प्रत्येक डालने पर मूल्य।

ध्यान दें कि मैंने केवल एसक्यूएल सर्वर के साथ इसका परीक्षण किया है। कस्टम प्रकार शायद अन्य डेटाबेस में उपलब्ध होगा या उपलब्ध नहीं होगा।

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