2013-06-19 8 views
5

मैंने कुछ हफ्ते पहले एक नई परियोजना शुरू की और ईएफ कोड देने का फैसला किया, पहले प्रयास करें, मैंने पहले एनएचबीरनेट का इस्तेमाल किया और मुझे ओआरएम आउट ऑफ़ द- एमएस से धनुष, और अब तक यह बहुत अच्छा रहा है - जब तक कि मैंने जटिल वस्तुओं को बनाना शुरू नहीं किया।ईएफ बनाम निबर्ननेट मर्ज डिस्कनेक्टेड ऑब्जेक्ट ग्राफ़

मेरा प्रोजेक्ट टियर निम्नानुसार है: एज़ूर डब्ल्यूसीएफ भूमिका - ईएफ कोड प्रथम के साथ डीएएल को संभालने के लिए। ग्राहक के साथ सौदा करने के लिए नॉकआउट के साथ एमवीसी 4 के साथ Azure वेबसाइट की भूमिका। (मैं भविष्य के लिए WCFRole बनाई है जहाँ हम विभिन्न प्लेटफार्मों से सेवा के लिए उपयोग की आवश्यकता होगी)

यहाँ बहुत ही बुनियादी एफई कोड पहले डिजाइन है कि मैं कुछ समस्या आ रही है: -मैं केवल स्थानांतरित सेवा और साइट के बीच डीटीओ, और यदि कोई मौजूद है तो आंतरिक डीटीओ को मानचित्रित करने के लिए एक सामान्य मैपर बनाया। - मेरे पास एक सिटी टेबल है, और एक सिटी प्रॉपर्टी के साथ एक एड्रेस ऑब्जेक्ट है (हमें विशेष कार्यों के लिए एक संपत्ति के रूप में शहर की आवश्यकता है और न केवल नाम)

ग्राहक शहरों की सूची जानता है, और एक नया पता लौटा रहा है मौजूदा शहर जब मैं नया पता जोड़ने का प्रयास करता हूं, तो पुराने शहर के डेटा के साथ एक नया शहर बनाया जाता है, मुझे पहले से ही यह पता चला है कि ऐसा इसलिए होता है क्योंकि ईएफ को पता नहीं है कि डिस्कनेक्ट की गई वस्तुओं को कैसे विलय करना है और जो मैंने पढ़ा है किसी भी विलय की कमी का समर्थन नहीं करता है, और यह कि सरल इतना आसान समाधान केवल ऑब्जेक्ट स्टेट का प्रबंधन नहीं कर रहा है - शहर ऑब्जेक्ट स्टेटस को अपरिवर्तित में बदलें।

लेकिन एक बड़ा जटिल db डिजाइन के साथ इस से निपटने भयानक लग रहा

मेरे सवाल - सबसे अच्छा अभ्यास/इस से निपटने का आसान तरीका क्या है? मैंने समाधानों के बारे में सोचा - जैसे सेवचेंज विधि को ओवरराइड करना, हालांकि सभी ऑब्जेक्ट्स और यदि आईडी शून्य/0/कुछ अन्य सम्मेलन को अपरिवर्तित से बदलने के लिए नहीं है - क्या यह समाधान किया जा सकता है?

मेरा दूसरा प्रश्न - क्योंकि मुझे एनएचबेर्नेट (जुड़े ऑब्जेक्ट्स के साथ) के साथ बहुत अधिक अनुभव है - मैं सोच रहा था कि एनएचबीर्नेट इस पर क्या ले रहा है? मैंने कहीं पढ़ा है कि एनएचबीर्नेट में डिस्कनेक्टेड जटिल वस्तुओं को दोबारा जोड़ने की ऑटोमैजिक मर्ज क्षमता है, क्या यह सच है? क्या मेरा मूल डिस्कनेक्ट पता होगा-> सिटी डिज़ाइन उस ऑटोमैजिक मर्ज के साथ ऑफ-द-द-बॉक्स काम करेगा? और इसका उपयोग करने की विधियां क्या हैं?

धन्यवाद एक बहुत :)

अद्यतन: जारी करने के लिए एक सरल कोड।

public void Add(AddressDto address) 
    { 
     using (var context = new MyContext()) 
     { 
      context.Addresses.Add(address.FromDto<Address>()); 

      context.SaveChanges(); 
     } 
    } 

"FromDto", सामान्य मैपर विस्तार है यह शहर (और City.ID संपत्ति)

सहित सभी जानकारी के साथ नए पते, बनाता है:

public class Address 
{ 
    public int ID { get; set; } 

    public virtual City City { get; set; } 
} 

public class City 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 
    public virtual Zone Zone { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public MyContext() : base("TransportService") { } 

    public virtual DbSet<City> Cities { get; set; } 
    public virtual DbSet<Address> Addresses { get; set; } 

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

     modelBuilder.Entity<Address>() 
      .HasRequired(x => x.City) 
      .WithMany().WillCascadeOnDelete(true); 

    } 
} 

नया पता जोड़ना

इसका परिणाम पुराने शहर के संदर्भ का उपयोग करने के बजाय एक नया शहर बनाना होगा।

+1

यदि आप कुछ प्रश्न दिखाते हैं जो आपके प्रश्न को प्रदर्शित करता है तो इसका उत्तर देना बहुत आसान होगा। ईएफ डिस्कनेक्ट ऑब्जेक्ट्स को मर्ज कर सकता है, इसे _relationship fixup_ नामक पृष्ठभूमि प्रक्रिया मिली है, लेकिन कोड के बिना यह बताने में मुश्किल है कि यह आपकी मदद करता है या नहीं। –

+0

मैंने मूल डिज़ाइन दिया, मैं कोड जोड़ूंगा। रिलेशनशिप फिक्सअप के बारे में मैंने जो पढ़ा है उससे –

+1

- यह मैन्युअल पुनर्निर्देशन है, और यह केवल तभी काम करता है जब वर्तमान संदर्भ में सभी ऑब्जेक्ट्स को फिर से कनेक्ट किया जाए। निबर्ननेट ने प्राइमरी कुंजी द्वारा ऑटो विलय किया है, यह सुविधा बड़ी जटिल वस्तुओं में इतनी परेशानी बचाती है कि ईएफ उन परियोजनाओं में भी उम्मीदवार नहीं है, आपको केवल आंतरिक वस्तुओं के 3-4 स्तर की आवश्यकता है, और संदर्भ से उनका कनेक्शन बनाए रखना शुरू होगा एक अलग वातावरण में आप पर पहनने के लिए ... –

उत्तर

3

मैंने पाया कि ईएफ में ऑटो विलय नहीं है, उनकी मर्ज क्षमताओं को अभी तक मैन्युअल विलय है, और यह केवल तभी काम करेगा जब संदर्भ ऑब्जेक्ट में ऑब्जेक्ट की सभी निर्भरताओं को याद किया जाए।

बहुस्तरीय डिस्कनेक्ट किए गए ऑब्जेक्ट्स से निपटना, और मैन्युअल रूप से उन्हें पुनः कनेक्ट करने से निपटना बहुत काम है और परिणामस्वरूप वास्तव में अजीब और मुश्किलों को संभालने में मुश्किल हो सकती है (जैसा कि उस प्रश्न में बताया गया है जहां नए शहरों ने बनाया था क्योंकि यह ' टी विलय हो गया है, इसलिए यह सिर्फ एक नया आईडी बनाया गया है, भले ही उसके पास आईडी हो)

इसलिए अब - निबर्ननेट इस लड़ाई को जीतता है, निबर्ननेट में एक ऑटोमैटिक विलय कार्यक्षमता है, यदि आपकी डिस्कनेक्ट ऑब्जेक्ट में एक आईडी है तो यह विलय करने का प्रयास करेगी यह, और सफल हो (मेरे अनुभव से) ईएफ की तुलना में चीजें चलाने के लिए यह थोड़ा और सेटिंग है, लेकिन यह मुसीबत के लायक है।

+2

हैं, तो मैं सहमत हूं। इकाई फ्रेमवर्क के लिए कितनी बड़ी याद आती है। हां, एनएचबर्ननेट के साथ चीजों को सही करने के लिए कुछ "ट्वीकिंग" लेता है, लेकिन वाह, आप इसे चलाते हैं .र्ज() और बी 00 एम! हो गया। आपके प्रश्न का पालन करने के लिए धन्यवाद ... अब मुझे पता है कि मैं पागल नहीं हूँ। – granadaCoder

+0

यह दिखाने के लिए यहां एक अच्छा लिंक है कि "मैन्युअल ट्रैकिंग" कैसे होता है .... यह लिंक "डिस्कनेक्ट" के लिए है :::: http://www.entityframeworktutorial.net/EntityFramework4.3/delete-entity-using -dbcontext.aspx – granadaCoder

+0

क्या E7 को किसी भी मौके से डिस्कनेक्ट की गई संस्थाओं के लिए बेहतर समर्थन मिलेगा? – HappyNomad

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