2012-02-02 8 views
7

मैं एक सुविज्ञ एन हाइबरनेट उपवर्ग मानचित्रण है कि वर्तमान में कुछ इस तरह दिखता बनाने हूँ:फ़्लुएंट निबर्ननेट टेबल-प्रति-सबक्लास रणनीति का उपयोग करते समय आप पहचान कॉलम निर्दिष्ट कर सकते हैं?

Test.TaskRepositoryTest.DeleteTest: 
NHibernate.Exceptions.GenericADOException : could not insert: [TaskManager.Entities.TaskDownload#269][SQL: INSERT INTO TasksDownload (ExtraProperty1, ExtraProperty2, Task_id) VALUES (?, ?, ?)] 
    ----> System.Data.SqlClient.SqlException : Invalid column name 'Task_id'. 

यह क्योंकि ईद है:

public class TaskDownloadMap: SubclassMap<TaskDownload> 
{ 
    public TaskDownloadMap() 
    { 
     Table("TasksDownload"); 

     Map(x => x.ExtraProperty1, "ExtraProperty1") 
      .Nullable(); 

     Map(x => x.ExtraProperty2, "ExtraProperty2") 
      .Nullable(); 
    } 
} 

जब मैं कोशिश करते हैं और इन संस्थाओं में से एक को बचाने मैं एक अपवाद मिल कॉलम मैंने अपने सबक्लास की तालिका पर सेट किया है जिसे "टास्क आईडी" नाम दिया गया है। क्या डिफ़ॉल्ट नामकरण योजना को ओवरराइड करने के लिए कुछ है जो निबर्ननेट उपयोग करने का प्रयास कर रहा है? मुझे उपclass में "आईडी" कॉलम निर्दिष्ट करने की क्षमता नहीं है और मैं इसके बारे में किसी और को भी नहीं ढूंढ सकता।

माता पिता मानचित्रण इस तरह दिखता है:

public class TaskMap: ClassMap<Task> 
{ 
    public TaskMap() 
    { 
     Table("Tasks"); 

     Id(x => x.Id, "Id") 
      .GeneratedBy.Identity(); 

     . 
     . 
     . 

    } 
} 

जैसा कि मैंने कहा इससे पहले कि मैं टेबल-पर-उपवर्ग रणनीति के साथ जा रहा हूँ तो इन 2 अलग-अलग तालिकाओं कर रहे हैं। मैं अपने टास्क डाउनलोड फ़ाइल पर "टास्क_आईडी" होने के लिए कुंजी बदल सकता हूं, लेकिन मैं बस यह निर्दिष्ट करने में सक्षम हूं कि यह मेरे मैपिंग में "टास्क आईडी" है, इसलिए मैं अपने नामकरण सम्मेलन में रह सकता हूं।

+0

अपने पदानुक्रम कैसे है की तरह लग रहा है? क्या आप अभिभावक मानचित्रण पोस्ट कर सकते हैं? – nemesv

+0

अभिभावक मैपिंग रखने के लिए संपादित पोस्ट। –

उत्तर

4

आप सबक्लास आईडी को धाराप्रवाह एपीआई के साथ कॉन्फ़िगर नहीं कर सकते हैं क्योंकि इसे अंतर्निहित मैपिंग रूपांतरणों द्वारा नियंत्रित किया जाता है। लेकिन आप एक कस्टम convention लिख सकते हैं (यदि आवश्यक हो तो कुछ अतिरिक्त acceptance के साथ)।
एक नमूना समाधान:

public class JoinedSubclassIdConvention : IJoinedSubclassConvention, 
    IJoinedSubclassConventionAcceptance 
{ 
    public void Apply(IJoinedSubclassInstance instance) 
    { 
     instance.Key.Column(instance.EntityType.BaseType.Name + "Id"); 
    } 

    public void Accept(IAcceptanceCriteria<IJoinedSubclassInspector> criteria) 
    { 
     criteria.Expect(x => x.EntityType == typeof(TaskDownload)); 
    } 
} 

तो फिर तुम विन्यास करने के लिए अपने convetion जोड़ें:

Fluently.Configure() 
    //... 
    .Mappings(m => 
     { 
      m.FluentMappings 
      //... 
      .Conventions.Add<JoinedSubclassIdConvention>(); 
     }); 
+0

अपना समाधान निकाला और यह एक आकर्षण की तरह काम किया। सहायता के लिए धन्यवाद। –

+0

वास्तव में पुराना सवाल है, लेकिन अभी भी प्रासंगिक है। यह एक सम्मेलन के रूप में केवल कॉन्फ़िगर करने योग्य क्यों है, न कि प्रति-मानचित्र विधि के रूप में? – shortstuffsushi