2012-07-10 15 views
22

मैं एक परियोजना पर काम कर रहा हूं जो उपयोगकर्ता को इकाइयों की सूची संपादित करने की अनुमति देता है। मैं इन इकाइयों को मॉडल देखने और उन्हें संपादक फ़ील्ड के साथ प्रदर्शित करने के लिए मानचित्र करता हूं। उपयोगकर्ता सबमिट बटन दबाता है, तो मैं एक मॉडल के माध्यम से जाना और इतने की तरह इसे अद्यतन:इकाइयों की सूची अद्यतन करने का कुशल तरीका

foreach (var viewModel in viewModels) 
{ 
    //Find the database model and set the value and update 
    var entity = unit.EntityRepository.GetByID(fieldModel.ID); 
    entity.Value = viewModel.Value; 
    unit.EntityRepository.Update(entity); 
} 

ऊपर कोड काम करता है, लेकिन जैसा कि आप देख सकते हैं कि हम हर इकाई के लिए दो बार डेटाबेस हिट करने के लिए (एक बार फिर से प्राप्त करने की जरूरत है और दूसरा अपडेट करने के लिए)। क्या एंटिटी फ्रेमवर्क का उपयोग करके ऐसा करने का एक और अधिक प्रभावी तरीका है? मैंने देखा कि प्रत्येक अद्यतन एक अलग SQL कथन उत्पन्न करता है। क्या लूप समाप्त होने के बाद सभी अपडेट करने का कोई तरीका है?

+0

निम्नलिखित लिंक देखें। http://stackoverflow.com/questions/6199211/entity-framework-4-1-batch-updates –

+0

@Saqib मैं का उपयोग कर SQL कथन –

उत्तर

16

यहाँ कर के बिना डेटाबेस में एक इकाई को अद्यतन करने के दो तरीके मैं के बारे में पता कर रहे हैं मदद कर सकता है है पहली इकाई का एक पुनः प्राप्ति:

//Assuming person is detached from the context 
//for both examples 
public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime BornOn { get; set; } 
} 

public void UpdatePerson(Person person) 
{ 
    this.Context.Persons.Attach(person) 
    DbEntityEntry<Person> entry = Context.Entry(person); 
    entry.State = System.Data.EntityState.Modified; 
    Context.SaveChanges(); 
} 

उपज चाहिए:

Update [schema].[table] 
Set Name = @p__linq__0, BornOn = @p__linq__1 
Where id = @p__linq__2 

या यदि आप करने के लिए (शायद स्तंभों की एक टन के साथ टेबल के लिए अच्छा होगा कि आप केवल फ़ील्ड निर्दिष्ट कर सकते हैं, या सुरक्षा उद्देश्यों के लिए, की अनुमति देता है केवल विशिष्ट स्तंभ अद्यतन किया जाना:

public void UpdatePersonNameOnly(Person person) 
{ 
    this.Context.Persons.Attach(person) 
    DbEntityEntry<Person> entry = Context.Entry(person); 
    entry.Property(e => e.Name).IsModified = true; 
    Context.SaveChanges(); 
} 

उपज चाहिए:

Update [schema].[table] 
Set Name = @p__linq__0 
Where id = @p__linq__1 
+0

मुझे एंट्री() विधि नहीं मिल रही है, यह डीबीसेट क्लास का हिस्सा नहीं है। क्या यह एक विस्तार वर्ग में है? –

+0

विरोधों को कॉन्टेक्स्ट में डीबीसेट नहीं करता है। मेरी गलती। –

+3

मैं इस तथ्य को हाइलाइट करना चाहता हूं कि यह द्रव्यमान को बदलने के लिए सबसे सुंदर समाधान है, मैंने सहेजने वाले बदलावों को विधि से बाहर कर दिया है, इसे ऑब्जेक्ट्स के माध्यम से लूप में लूप में रखा है। फिर एक बार looped और इकाइयों को बदल दिया जाता है, परिवर्तनों को बचाओ कहा जाता है। – Jay

-1

मुझे यकीन नहीं है कि बीटा में मौजूदा संस्करण या इकाई फ्रेमवर्क के आरसी बैच अपडेट की तरह कुछ समर्थन करता है या नहीं। लेकिन उनकी Nuget

पर एफई 4.3.1 के लिए एक एक्सटेंशन

http://nuget.org/packages/EntityFramework.Extended

आशा यह आप अपने आवश्यकता को प्राप्त करने के

+1

समस्या एक पोस्ट में वापस एकाधिक पंक्तियों नहीं है से बचने के लिए कोशिश कर रहा हूँ कि उपयोगकर्ता संपादित किया गया। समस्या यह है कि उपयोगकर्ता द्वारा संपादित पंक्तियों को संग्रहीत करने के लिए डेटाबेस को कुशलता से कैसे क्वेरी करें। –

5

आप प्रश्नों को कम करने के follwoing कोशिश कर सकते हैं:

using (var ctx = new MyContext()) 
{ 
    var entityDict = ctx.Entities 
     .Where(e => viewModels.Select(v => v.ID).Contains(e.ID)) 
     .ToDictionary(e => e.ID); // one DB query 

    foreach (var viewModel in viewModels) 
    { 
     Entity entity; 
     if (entityDict.TryGetValue(viewModel.ID, out entity)) 
      entity.Value = viewModel.Value; 
    } 

    ctx.SaveChanges(); //single transaction with multiple UPDATE statements 
} 

ध्यान रखें that Contains can be potentially slow अगर viewModels की सूची बहुत लंबा है लेकिन यह केवल एक ही क्वेरी चलाएगा।

-1

हैटसोफ्ट ने पहले से ही EntityFramework का उल्लेख किया है। विस्तारित। विस्तारित ढांचे के आधार पर बस निम्नलिखित उदाहरण देखें।

http://weblogs.asp.net/pwelter34/archive/2011/11/29/entity-framework-batch-update-and-future-queries.aspx

+0

बहुत बढ़िया मैं इसे देखता हूं –

+1

मैंने सोचा कि स्टैक ओवरफ्लो लिंक उत्तरों के खिलाफ था क्योंकि लिंक मर सकता है। – SolidSnake4444

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