2017-09-06 24 views
10

में एक कस्टम सम्मेलन के साथ कॉलम मैपिंग को नियंत्रित करना मेरे पास एक वर्ग TypeEntity है जो कई दर्जन इकाइयों के लिए बेस क्लास के रूप में कार्य करेगा। मैं टीपीसी का उपयोग कर रहा हूं, इसलिए मुझे बेस क्लास के सभी गुणों को कंक्रीट क्लास के नाम से तालिका में मैप करने की आवश्यकता है, और डेटाबेस उत्पन्न होने के लिए Key फ़ील्ड सेट करें।इकाई फ्रेमवर्क 6

वर्तमान में मैं प्रत्येक इकाई प्रकार है कि इस तरह दिखता है के लिए एक EntityTypeConfiguration के साथ इस कर रहा हूँ:

class LineItemType : EntityTypeConfiguration<Models.LineItemType> 
{ 
    public LineItemType() 
    { 
     this.Property(e => e.Key) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

     this.Map(e => e.MapInheritedProperties() 
         .ToTable(nameof(LineItemType))); 
    } 
} 

यह ठीक काम करता है, लेकिन बहुत दोहराव है। मुझे TypeEntity से प्राप्त होने वाले प्रत्येक प्रकार के लिए कॉन्फ़िगरेशन क्लास बनाना याद रखना है, कुंजी सेट करें, और विरासत गुणों को मैप करें। यह कस्टम Convention के लिए एक आदर्श मामला जैसा प्रतीत होता है।


मैं एक TypeEntityTpcConventionConvention इस प्रकार बनाया:

class TypeEntityTpcConvention : Convention 
{ 
    public TypeEntityTpcConvention() 
    { 
     this.Types<TypeEntity>() 
      .Configure(e => e.Property(p => p.Key) 
          .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)); 
    } 
} 

कौन सा Key स्थापित करने के लिए के रूप में डेटाबेस उत्पन्न काम करता है, लेकिन मैं एक सम्मेलन अंदर से संपत्तियों के लिए तालिका मैपिंग का उपयोग करने के लिए किसी भी तरह नहीं मिल सकता है ।

this.Types<TypeEntity>() 
    .Configure(e => e.Property(p=>p.Key) 
        .ToTable(e.ClrType.Name)); 

न तो जिनमें से लगता है: प्रत्येक संपत्ति मैप किया जा करने की जरूरत है कि के लिए इस तरह

this.Types<TypeEntity>() 
    .Configure(e => e.MapInheritedProperties() 
    .ToTable(e.ClrType.Name)); 

या यहां तक ​​कि एक फोन:


आदर्श रूप में, मैं कुछ इस तरह उम्मीद थी अस्तित्व होना। क्या Convention के अंदर से संपत्तियों के मैपिंग को नियंत्रित करने का कोई तरीका है?


कुछ अतिरिक्त अनुसंधान के बाद, ऐसा लगता है कि वहाँ और अधिक उन्नत सम्मेलन कैसे इन गंभीर रूप से कमी है का उपयोग करने के लिए IStoreModelConvention और IConceptualModelConvention के रूप में उपलब्ध विकल्प है, लेकिन उपयोगी प्रलेखन हैं की तरह। ब्रेकपॉइंट्स और खिड़कियों को देखने के लिए कई घंटों के बाद पोकिंग करते हुए, मुझे पता नहीं चला कि इन इंटरफेस का उपयोग करके कॉलम मैपिंग को कैसे नियंत्रित किया जाए।


मेरे वर्तमान समाधान सभी प्रकार कि OnModelCreating में TypeEntity से विरासत को खोजने के लिए प्रतिबिंब का उपयोग करने, और सही मेज पर गुण नक्शा है। यह काम करता है, लेकिन यदि संभव हो तो मैं एक सम्मेलन का उपयोग करना पसंद करूंगा, क्योंकि यह वास्तव में लगता है कि चीजों के प्रकार के प्रकार के लिए बनाया गया था। मुझे लगता है कि मुझे कुछ याद आ रही है।

+0

समस्या क्लास का नाम नहीं मिल रहा है, यह है कि '.ToTable' (या कुछ और जो मुझे किसी संपत्ति को एक अलग तालिका में रीडायरेक्ट करने की अनुमति देता है) एक 'कन्वेंशन' के संदर्भ में मौजूद प्रतीत नहीं होता है। –

+0

आह .. मुझे गलत समझा गया। मैं टिप्पणी हटा दूंगा। –

+0

मेरे पास एक समाधान है। यह वास्तव में एक सम्मेलन नहीं है, लेकिन यह आपके द्वारा निर्दिष्ट सभी प्रकारों पर स्वचालित रूप से लागू होता है (यानी आपको प्रत्येक इकाई के लिए कॉन्फ़िगर की एक नई पंक्ति जोड़ने की आवश्यकता नहीं है)। यदि आप रुचि रखते हैं, तो मैं इसे पोस्ट कर सकता हूं। –

उत्तर

9

जहां तक ​​मैं देख सकता हूँ, तुम बस अपनी DbContext की OnModelCreating विधि में टाइप विन्यास लिख सकता है और यह बहुत ही कोड आप पहले से ही प्रश्न में आपका उल्लेख के समान है।

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Types<TypeEntity>().Configure(c => 
    { 
     c.HasKey(p => p.Key); 
     // probably not needed, but won't do any harm 
     c.Property(p => p.Key).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     c.ToTable(c.ClrType.Name); 
    }); 
} 

यदि इस दृष्टिकोण में कोई समस्या है, तो मुझे बताएं और मैं इस विषय पर फिर से जाऊंगा।

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

ठीक उसी सिद्धांत परंपराओं से लागू किया जा सकता:

class TypeEntityConvention : Convention 
{ 
    public TypeEntityConvention() 
    { 
     this.Types<TypeEntity>().Configure(c => 
     { 
      c.HasKey(p => p.Key); 
      c.Property(p => p.Key).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
      c.ToTable(c.ClrType.Name); 
     }); 
    } 
} 

और

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Conventions.Add<TypeEntityConvention>(); 
} 
+0

यह मेरा समाधान भी होता। एक सम्मेलन नहीं, लेकिन यह प्रतिबिंब के बिना सामान्य है। –

+0

मैं वर्तमान में उपयोग कर रहे प्रतिबिंब के आधार पर आपके समाधान को बेहतर पसंद करता हूं, लेकिन यह वास्तव में ऐसा लगता है कि 'कन्वेंशन' को संभालने में सक्षम होना चाहिए। इस बिंदु पर, मेरे पास एक व्यावहारिक समाधान है, और यह सीखने की मेरी इच्छा है कि सम्मेलनों का प्रभावी ढंग से उपयोग कैसे करें, जो अब इस प्रश्न को खुला रख रहा है। –

+0

@BradleyUffner मेरा अपडेट देखें। – grek40

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