अद्यतन (2010-12-21): परीक्षणों के आधार पर इस प्रश्न को पूरी तरह से पुनर्लेखित करें जो मैं कर रहा हूं। इसके अलावा, यह एक पीओसीओ विशिष्ट प्रश्न होता था, लेकिन यह पता चला कि मेरा प्रश्न अनिवार्य रूप से POCO विशिष्ट नहीं है।आशावादी कॉनकुरेंसी अपवाद कुछ स्थितियों में इकाई फ्रेमवर्क में काम नहीं करता है
मैं इकाई फ्रेमवर्क का उपयोग कर रहा हूं और मुझे अपने डेटाबेस तालिका में टाइमस्टैम्प कॉलम मिला है जिसका उपयोग आशावादी समेकन के लिए परिवर्तनों को ट्रैक करने के लिए किया जाना चाहिए। मैंने एंटिटी डिज़ाइनर में "फिक्स्ड" में इस संपत्ति के लिए समवर्ती मोड सेट किया है और मुझे असंगत परिणाम मिल रहे हैं। यहां कुछ सरल परिदृश्य हैं जो दर्शाते हैं कि समेकन जांच एक परिदृश्य में काम करती है लेकिन दूसरे में नहीं।
सफलतापूर्वक OptimisticConcurrencyException फेंकता है:
अगर मैं एक कट इकाई देते हैं, तो SaveChanges एक OptimisticConcurrencyException फेंक होगा अगर वहाँ एक टाइमस्टैम्प संघर्ष है:
[HttpPost]
public ActionResult Index(Person person) {
_context.People.Attach(person);
var state = _context.ObjectStateManager.GetObjectStateEntry(person);
state.ChangeState(System.Data.EntityState.Modified);
_context.SaveChanges();
return RedirectToAction("Index");
}
फेंक नहीं है OptimisticConcurrencyException:
दूसरी ओर, अगर मैं अपनी इकाई की एक नई प्रति डी से पुनर्प्राप्त करता हूं
[HttpPost]
public ActionResult Index(Person person) {
var currentPerson = _context.People.Where(x => x.Id == person.Id).First();
currentPerson.Name = person.Name;
// currentPerson.VerColm == [0,0,0,0,0,0,15,167]
// person.VerColm == [0,0,0,0,0,0,15,166]
currentPerson.VerColm = person.VerColm;
// in POCO, currentPerson.VerColm == [0,0,0,0,0,0,15,166]
// in non-POCO, currentPerson.VerColm doesn't change and is still [0,0,0,0,0,0,15,167]
_context.SaveChanges();
return RedirectToAction("Index");
}
एसक्यूएल प्रोफाइलर के आधार पर यह दिखाई देता है: atabase और मैं कुछ क्षेत्रों पर एक आंशिक अद्यतन करते हैं, और उसके बाद SaveChanges() कहते हैं, तो भले ही एक टाइमस्टैम्प द्वंद्व हो, मैं नहीं एक OptimisticConcurrencyException मिलता है इकाई फ्रेमवर्क नए VerColm (जो टाइमस्टैम्प संपत्ति है) को अनदेखा कर रहा है और इसके बजाय मूल रूप से लोड वर्कॉल का उपयोग कर रहा है। इस वजह से, यह कभी भी आशावादी कॉनकुरेंसी अपवाद नहीं फेंक देगा।
अद्यतन:
ध्यान दें कि मैं भी मैं क्या मेरे नियंत्रक कार्रवाई में देखने के इस उदाहरण के माध्यम से काम करते हुए के साथ मेल खाना उपरोक्त कोड पर टिप्पणियां जोड़ीं: जनवरी के अनुरोध के अनुसार अतिरिक्त जानकारी जोड़ना।
यह अद्यतन करने से पहले मेरी डेटाबेस में VerColm का मान: 0x0000000000000FA7
यहाँ एसक्यूएल प्रोफाइलर जब अद्यतन कर से पता चलता है:
exec sp_executesql N'update [dbo].[People]
set [Name] = @0
where (([Id] = @1) and ([VerColm] = @2))
select [VerColm]
from [dbo].[People]
where @@ROWCOUNT > 0 and [Id] = @1',N'@0 nvarchar(50),@1 int,@2 binary(8)',@0=N'hello',@1=1,@2=0x0000000000000FA7
ध्यान दें कि @ 2 0x0000000000000FA6 किया जाना चाहिए था , लेकिन यह 0x0000000000000FA7
है यहाँ VerColm अद्यतन करने के बाद अपने डेटाबेस में है: 0x0000000000000FA8
क्या कोई जानता है कि मैं इस समस्या के आसपास कैसे काम कर सकता हूं? जब मैं मौजूदा इकाई को अद्यतन करता हूं और टाइमस्टैम्प संघर्ष होता है तो मैं इकाई फ्रेमवर्क को अपवाद फेंकना चाहता हूं।
धन्यवाद
कृपया कोड को सहेजने वाले कोड को पोस्ट करें। –
मैं इसे पुन: उत्पन्न नहीं कर सकता। जब मैं भारित और संशोधित इकाई को टाइमस्टैम्प संघर्ष के साथ सहेजने का प्रयास करता हूं तो मुझे आशावादी कॉनकुरेंसी अपवाद मिलता है। क्या आप सुनिश्चित हैं कि आपके पास टाइमस्टैम्प संघर्ष है? क्या आप कृपया अपनी प्रोफाइल एसक्यूएल क्वेरी पोस्ट कर सकते हैं? – Jan
हाय जान, मैंने आपके अनुरोध के अनुसार अतिरिक्त जानकारी जोड़ा। –