2011-11-30 13 views
8

मैंने देखा कि एंटीटी फ्रेमवर्क में अभी भी उनकी नवीनतम रिलीज में बहुत सारी "ऑटोमैटिकल" विशेषताएं हैं। हमेशा की तरह, यह वास्तव में दोहरी तलवार वाली तलवार है।क्या मैं इकाई फ्रेमवर्क कोड में स्वचालित संबंधों को पहले अक्षम कर सकता हूं?

विशेष रूप से, मैं fluentAPI (http://msdn.microsoft.com/en-us/library/hh295844(v=vs.103) का उपयोग करके कोड में फ्लाई पर अपना मॉडल बनाने के लिए ऑनमोडेलबिल्डर ईवेंट का उपयोग कर रहा हूं। .aspx)। मेरे पास इकाइयों का एक बड़ा समूह है, और वे सभी माइक्रोसॉफ्ट "मानकों" का पालन नहीं करते हैं। उदाहरण के लिए, मेरे आईडी कॉलम को PersonId के बजाय Person_id नाम दिया गया है। इस प्रकार, इकाई हमेशा किसी तालिका पर प्राथमिक कुंजी को स्वत: पहचान नहीं पाती है, या कम से कम, ऐसा नहीं लगता है।

मुझे मॉडल बनाने के दौरान स्पष्ट होने पर कोई फर्क नहीं पड़ता है, लेकिन मुझे परेशानी क्या है कि मुझे हमेशा यकीन नहीं है कि गुण और रिश्तों क्या संस्थाएं स्वतः पता लगाएंगी और कौन सा गलती से अनदेखा या गलत पहचान होगी। चूंकि मेरी अधिकांश संस्थाओं में सहायक विधियों और गुणों (enums, आदि को संभालने के लिए सामान) के साथ आंशिक वर्ग भी है, मुझे बहुत डर है कि किसी दिन एंटिटी स्वचालित रूप से उन चीजों के बीच मैपिंग बनायेगी जिन्हें मैप नहीं किया जाना चाहिए (विफलता इकाई हो सकती है या कुछ अस्पष्ट प्रोग्रामर)।

क्या कोई तरीका है कि मैं एंटिटी की ऑटो-रिलेशनशिप-हुकअप सुविधा को अक्षम कर सकता हूं ताकि मैं अपने ऑनमोडेलबिल्डर विधि में 100% स्पष्ट हो सकूं? या, कम से कम, मुझे कैसे पता चलेगा कि मुझे अतिरिक्त मैपिंग विवरण जोड़ने की आवश्यकता है (जैसे फ़ील्ड को वैकल्पिक घोषित करने की आवश्यकता है, या जब कोई विशिष्ट नेविगेशन प्रॉपर्टी स्वतः नहीं हो पाई जाती है)?

धन्यवाद!

+0

यदि यह सामान आपको चिंतित करता है, तो आपको शायद "कोड पहले" सामग्री –

+0

की बजाय ईएफ के "डिजाइन पहले" पहलुओं का उपयोग करना चाहिए, मैंने संयोग से ईडीएमएक्स के साथ शुरुआत की। मैं कोड-पहली सोच में 'अपग्रेड' करने की कोशिश कर रहा था कि यह प्रबंधित करना आसान हो सकता है क्योंकि यह सभी कोड में होगा, लेकिन यह प्रयास और समय डिबगिंग के लायक नहीं हो सकता है। – Brett

उत्तर

6

ऑटो जादू एफई कोड पहले अंदर सम्मेलनों द्वारा किया जाता है। आप कुछ जादू बंद करने के लिए उन conventions को हटा सकते हैं या आप remove them all कर सकते हैं और उसके बाद आपको अपने धाराप्रवाह-एपीआई में 100% स्पष्ट होना होगा।

+0

वाह! मुझे ठीक इसी की आवश्यकता थी! – Brett

+0

ईएफ 6 सभी सम्मेलनों को हटाने में मदद नहीं करता है ... अंत में पोस्ट किया गया मेरा उत्तर और कोड स्निपेट देखें। – baHI

0

बस अपनी संस्थाओं विन्यास में अपने रिश्ते, चाबियाँ और कॉलम पर स्पष्ट रहें और यह वास्तव में कोई मुद्दा नहीं होना चाहिए।

व्यक्तिगत रूप से, कोडिंग करते समय, इसे तब तक मानने दें जब तक यह टूट न जाए और फिर मैं कॉन्फ़िगरेशन को सही करता हूं।

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    Database.SetInitializer<AccountWriteContext>(null); 

    modelBuilder.Configurations.Add(new AccountEntityTypeConfiguration()); 
    modelBuilder.Configurations.Add(new AccountOwnerEntityTypeConfiguration()); 
    modelBuilder.Configurations.Add(new CreditCardEntityTypeConfiguration()); 
    modelBuilder.Configurations.Add(new TenantEntityTypeConfiguration()); 
    //blah blah blah 
} 


class AccountOwnerEntityTypeConfiguration 
    : EntityTypeConfiguration<AccountOwner> 
{ 
    public AccountOwnerEntityTypeConfiguration() 
    { 
     this.HasKey(p => p.ID); 
     this.Property(p => p.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired(); 

     this.HasRequired(o => o.CreditCard).WithMany().HasForeignKey(c => c.CreditCardID).WillCascadeOnDelete(true); 

     this.ToTable("AccountOwner", "AccountWrite"); 
    } 
} 
+0

यह कभी लिखा नहीं है जैसे यह लिखा है। यहां तक ​​कि उस सटीक उदाहरण में, यदि मुझे खाताऑनर इकाई में जाना था और एक संपत्ति जोड़ना था, तो ईएफ अगले माइग्रेशन में स्वचालित रूप से संपत्ति को जोड़ देगा, भले ही मैं इसे EntityType कॉन्फ़िगरेशन में नहीं जोड़ूं। 2011 में – Suamere

+0

ने किया। – William

-2

मैं ऐसा करने के लिए डेटा एनोटेशन विशेषताओं का उपयोग करने की अनुशंसा करता हूं। उदाहरण के लिए, [key] विशेषता का उपयोग आपकी प्राथमिक कुंजी को परिभाषित करने के लिए किया जा सकता है, और [table] विशेषता का उपयोग आपकी तालिका का नाम प्रदान करने के लिए किया जा सकता है। [required] विशेषता का उपयोग ईएफ को बताने के लिए किया जा सकता है कि एक फ़ील्ड आवश्यक है।

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

अधिक जानकारी के लिए, इस ब्लॉग पोस्ट है कि उपलब्ध विशेषताओं के सभी सूचीबद्ध करता है देखें:

http://blogs.msdn.com/b/efdesign/archive/2010/03/30/data-annotations-in-the-entity-framework-and-code-first.aspx

+0

सवाल "अक्षम कैसे करें" था। और मैं स्पष्ट रूप से बताता हूं कि कौन से कॉलम अक्षम हैं। यह अप्रासंगिक है कि आप एनोटेशन या धाराप्रवाह वाक्यविन्यास पसंद करते हैं। लक्ष्य नए गुणों को अनदेखा करने के लिए स्पष्ट रूप से बताने की आवश्यकता के बिना स्थिर मैपिंग होना है ... – baHI

0

वास्तव में इस कोड, सभी सम्मेलनों निकाल देता है, यहां तक ​​कि प्रारंभिक सेट को साफ करता है ...

... लेकिन अभी भी EntityTypeConfiguration साथ मैप नहीं कॉलम मैप की जाती हैं ...

private void RemoveAllConventions(DbModelBuilder modelBuilder) 
     { 
      new List<string>() 
      { 
      "_configurationConventions", 
      "_conceptualModelConventions", 
      "_conceptualToStoreMappingConventions", 
      "_storeModelConventions" 
      } 
      .ForEach(field => 
      { 
       var values = 
        (IEnumerable<IConvention>)typeof(ConventionsConfiguration) 
         .GetField(field, BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic) 
         .GetValue(modelBuilder.Conventions); 

       modelBuilder.Conventions.Remove(values.ToArray()); 
      }); 

      var initialCS = typeof(ConventionsConfiguration) 
         .GetField("_initialConventionSet", BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic) 
         .GetValue(modelBuilder.Conventions); 

      new List<string>() 
      { 
      "ConfigurationConventions", 
      "ConceptualModelConventions", 
      "ConceptualToStoreMappingConventions", 
      "StoreModelConventions" 
      } 
      .ForEach(field => 
      { 
       var values = 
        (IEnumerable<IConvention>) initialCS 
         .GetType() 
         .GetProperty(field, BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.Public) 
         .GetValue(initialCS); 

       modelBuilder.Conventions.Remove(values.ToArray()); 
      }); 


     } 
+1

कोड पोस्ट किए गए प्रश्नों का उत्तर देने पर यह वास्तव में स्पष्ट नहीं है। क्या यह आपकी वर्तमान स्थिति है, लेकिन यह अभी भी काम नहीं करता है? या यह इस मुद्दे को हल करता है, लेकिन अन्य प्रश्नों की ओर जाता है? – Tunaki

1

ठीक है को हटाने के बाद से सम्मेलनों का काम नहीं करता है, ईएफ 6 के अंदर सभी गैर-कॉन्फ़िगर किए गए गुणों को मानचित्र न करने का एक आसान तरीका है।एक्स

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

यहां मेरी जिस्ट का एक लिंक है, जहां कार्यान्वयन है। एक टिप्पणी के रूप में एक नमूना भी जोड़ा: https://gist.github.com/hidegh/36d92380c720804dee043fde8a863ecb

+0

यह सभी गुणों के लिए काम करना चाहिए, इसलिए संग्रह (1: एन) या अन्य संदर्भों के लिए भी (एन: 1) – baHI

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