2012-03-19 8 views
5

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

दूसरा SaveChanges में यह नमूना क्रैश, फोन जब एफई 0 countryID सेट करने का प्रयास:

public class Country 
{ 
    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 
} 

public class Person 
{ 
    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 

    public virtual int CountryID { get; set; } 
    public virtual Country Country { get; set; } 
} 

public class Context : DbContext 
{ 
    public DbSet<Person> Person { get; set; } 
    public DbSet<Country> Country { get; set; } 
} 

class Program 
{ 
    static void Foo() 
    { 
     using (var db = new Context()) 
     { 
      //var c = new Country(); 
      var c = db.Country.Create(); 
      c.Name = "usa"; 
      db.Country.AddOrUpdate(x => x.Name, c); 

      //var p = new Person(); 
      var p = db.Person.Create(); 
      p.Name = "billg"; 
      p.Country = c; 
      db.Person.AddOrUpdate(x => x.Name, p); 

      db.SaveChanges(); 
     } 
    } 
    static void Main() 
    { 
     Database.SetInitializer<Context>(new DropCreateDatabaseAlways<Context>()); 
     Foo(); 
     Foo(); 
    } 
} 

AddOrUpdate कैसे किया जाता है?

+1

मैं अत्यधिक तुम इसे पढ़ने के लिए सलाह देते हैं http://thedatafarm.com/blog/data-access/take-care-with-ef-4- 3-एडोरअपडेट-विधि/ –

उत्तर

9

IDbSetExtensions.AddOrUpdate कोड लिखने में मदद करने के लिए है जो डेटाबेस खाली या पॉप्युलेट है या नहीं।

AddOrUpdate केवल पहले माइग्रेशन कोड के Seed विधि में उपयोग किया जाना है। यह सामान्य कोड में उपयोग नहीं किया जाना चाहिए क्योंकि इसमें बड़े ओवरहेड और कुछ सीमाएं हैं। ओवरहेड डेटाबेस और प्रतिबिंब के लिए अतिरिक्त क्वेरी है। सीमा यह है कि यह केवल उस मुख्य इकाई की जांच करता है जिसे आप पारित कर रहे हैं लेकिन इसके संबंध नहीं। प्रत्येक संबंध AddOrUpdate को अलग कॉल द्वारा नियंत्रित किया जाता है:

static void Foo() 
{ 
    using (var db = new Context()) 
    { 
     var c = new Country() {Name = "abc"}; 
     db.Country.AddOrUpdate(x => x.Name, c); 

     var p = new Person() 
     { 
      Name = "me", 
      CountryID = c.ID, 
      Country = c 
     }; 

     db.Person.AddOrUpdate(x => x.Name, p); 
     db.SaveChanges(); 
    } 
} 
+1

मैंने इसे यहां पेस्ट करने के लिए अपना कोड छोटा कर दिया। मेरा एप्लिकेशन केवल एक DbMigrations कॉन्फ़िगरेशन में AddOrUpdate का उपयोग करता है। Seed ओवरराइड। आपका नमूना काम करता है, लेकिन मैं देश और देश आईडी दोनों को असाइन करने के बारे में असहज महसूस करता हूं। क्या आप हमेशा दोनों को आवंटित करने की सलाह देते हैं? मेरा एप्लिकेशन समग्र कुंजी का उपयोग करता है और यह केवल आसान, स्पष्ट और कम त्रुटि प्रवण है जो केवल नौसैनिक संपत्ति को असाइन करने के लिए प्रवण होता है। –

+0

@ ब्रूनोमार्टिनेज AddOrUpdate *** *** नेविगेशन प्रॉपर्टी (और डेटाबेस) पर निर्भर करता है कि विदेशी कुंजी मानों को सेट नहीं करेगा - भले ही उस इकाई को पहले से ही 'जोड़ा या अपडेट किया गया हो' या पूछताछ किया गया हो (और ईएफ होना चाहिए रिश्ते को ठीक करने में सक्षम)। वास्तव में, *** आपको केवल एफके *** सेट करने की आवश्यकता है, जब तक कि आपको बीज में बाद में संबंधों को नेविगेट करने की आवश्यकता न हो। इसके अलावा, यदि आप 'पहचानकर्ता एक्सप्रेशन' के हिस्से के रूप में रिश्ते का उपयोग करना चाहते हैं तो आपको एफके आईडी का उपयोग करना चाहिए क्योंकि यह एक आदिम या enum मान होना चाहिए और कॉलम में मैप की गई संपत्ति - अन्य इकाइयों का उपयोग नहीं किया जा सकता है। – JoeBrockhaus

+0

आरई: * "यह आसान, स्पष्ट और कम त्रुटि केवल नौसैनिक संपत्ति को आवंटित करने के लिए प्रवण है।" * मैं आपकी संस्थाओं के लिए कुछ विस्तार विधियों को जोड़ने के लिए सलाह दूंगा 'AddRelatedEntity (relatedEntity इकाई) {..}' या बस मूल ' मूल रूप से अपना 'AddOrUpdate() 'लिखने के लिए DbSet' विधियां। यह * निराशाजनक है कि यह एपीआई सतह डीवीसीएन्टेक्स्ट/डीबीसेट ऑपरेशंस के बाकी हिस्सों के समान सम्मेलनों का पालन नहीं करती है। ¯ \\ _ (ツ) _/¯ – JoeBrockhaus

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