5

मैं एंटिटी फ्रेमवर्क कोड पहले और SQL सर्वर कॉम्पैक्ट 4.0 का उपयोग कर एक .NET 4 WPF एप्लिकेशन बना रहा हूं। मैं एक पृष्ठभूमि धागे पर DbContext.SaveChanges() कॉल करने के लिए यूआई अवरुद्ध से बचने के लिए कोशिश कर रहा हूँ, लेकिन मैं कभी कभी निम्न अपवाद हो रही है:एसक्यूएल सर्वर कॉम्पैक्ट संस्करण 4 - AccessViolationException

internal static readonly object DbSaveLockObject = new object(); 
public static void SaveChanges() 
{ 
    Task.Factory.StartNew(() => 
    { 
     lock (DbSaveLockObject) 
     { 
      Debug.WriteLine(DateTime.Now + ": SaveChanges in lock"); 
      Db.SaveChanges(); 
     } 
    }); 
} 

उत्तर

2

यहां मुद्दा यह है DbContext वस्तु का उपयोग करने serializing नहीं है, यह अलग धागे से एक ही वस्तु का उपयोग करने से परहेज है समस्याओं का निवारण करने पर मेरे एमएस ब्लॉग के माध्यम से जाना चाहिए। इसलिए समाधान यह सुनिश्चित करना है कि जब भी आपको डेटाबेस से बातचीत करने की आवश्यकता हो, तो आप एक नई डीबीकॉन्टेक्स्ट ऑब्जेक्ट बनाते हैं।

using (var db = new SourceLogContext()) 
{ 
    db.LogSubscriptions.First(s => s.LogSubscriptionId == LogSubscriptionId) 
     .Log.Add((LogEntry)e.LogEntry); 
    db.SaveChanges(); 
} 

मुझे इस बारे में बिल्कुल यकीन नहीं है कि आप यूआई को अपडेट करने के साथ कैसे निपटते हैं। यदि उपरोक्त कोड पृष्ठभूमि थ्रेड में चल रहा है और यूआई पहले लॉगस्बस्क्रिप्शन.लोग संग्रह से जुड़ा हुआ है, तो यूआई थ्रेड संग्रह के एक अलग उदाहरण का संदर्भ दे रहा है और आपको इस संग्रह में नई प्रविष्टि भी जोड़नी होगी।

_uiThread.Post(entry => Log.Add((LogEntry)entry), e.LogEntry); 

एक और जटिलता आलसी लोड हो रहा है जहां संस्थाओं डेटाबेस से लोड नहीं किया जा सकता है जब तक उपयोगकर्ता यूआई के माध्यम से उन तक पहुँच गया है। इस संभाल करने के लिए ऐसा लगता है आप यूआई धागे के जीवन के लिए DbContext को कम से कम एक संदर्भ बनाए रखने के लिए है ..

private static readonly SourceLogContext DbUILazyLoadContext = new SourceLogContext(); 

मैं इन बातों पर टिप्पणी का स्वागत करते चाहते हैं ..

+2

क्या आपने कभी इस मुद्दे को हल किया है? मुझे एक समान समस्या है। –

+0

मुझे वास्तव में मेरे उत्तर में जो कुछ है उससे बेहतर समझ नहीं मिली। आप [AddNewLogEntry] में दो संग्रहों में जोड़ा जा रहा आइटम देख सकते हैं (https://github.com/tomhunter-gh/SourceLog/blob/aed3718af18fcff471f04c83f83a0160b97b6829/SourceLog.Model/LogSubscription.cs#L90) विधि, संदर्भ में एक बार संग्रह और एक बार "यूआई संग्रह" के लिए। –

+0

मुझे एक ही समस्या थी, यह एक पृष्ठभूमि कार्यकर्ता बन गया जो संदर्भ तक पहुंचने की कोशिश कर रहा था जबकि अन्य प्रक्रियाएं इसका उपयोग कर रही थीं। मैंने दूसरी प्रक्रियाओं के समाप्त होने के बाद उस कॉल को स्थानांतरित कर दिया और इसे हल किया। मुझे लगता है कि उन्हें कतार भी काम करेगा। जहां तक ​​मुझे पता है कि ईएफ को थ्रेडिंग का प्रबंधन करना चाहिए, तब तक मुझे ऐसा कोई मुद्दा नहीं था जब तक कि मैंने पृष्ठभूमि कॉल नहीं बनाया। – Hannish

0

एक AccessViolationException:

System.AccessViolationException occurred 
    Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
    Source=System.Data.SqlServerCe 
    StackTrace: 
     at System.Data.SqlServerCe.NativeMethodsHelper.OpenStore(IntPtr pOpenInfo, IntPtr pfnOnFlushFailure, IntPtr& pStoreService, IntPtr& pStoreServer, IntPtr& pQpServices, IntPtr& pSeStore, IntPtr& pTx, IntPtr& pQpDatabase, IntPtr& pQpSession, IntPtr& pStoreEvents, IntPtr& pError) 
     at System.Data.SqlServerCe.NativeMethods.OpenStore(IntPtr pOpenInfo, IntPtr pfnOnFlushFailure, IntPtr& pStoreService, IntPtr& pStoreServer, IntPtr& pQpServices, IntPtr& pSeStore, IntPtr& pTx, IntPtr& pQpDatabase, IntPtr& pQpSession, IntPtr& pStoreEvents, IntPtr& pError) 
     at System.Data.SqlServerCe.SqlCeConnection.Open(Boolean silent) 
     at System.Data.SqlServerCe.SqlCeConnection.Open() 
     at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) 
     at System.Data.EntityClient.EntityConnection.Open() 
     at System.Data.Objects.ObjectContext.EnsureConnection() 
     at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) 
     at System.Data.Entity.Internal.InternalContext.SaveChanges() 
     at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() 
     at System.Data.Entity.DbContext.SaveChanges() 
     at SourceLog.Model.LogSubscriptionManager.<SaveChanges>b__2() in C:\github.com\tomhunter-gh\SourceLog\SourceLog.Model\LogSubscriptionManager.cs:line 51 
    InnerException: (null) 

यहाँ कोड है कि कॉल SaveChanges() है तब होता है जब सत्यापन योग्य प्रबंधित कोड अप्रबंधित कोड या असुरक्षित प्रबंधित कोड के साथ इंटरैक्ट करता है।

आप यह कैसे पहुँच voilation error: http://blogs.msdn.com/b/sqlservercompact/archive/2009/05/06/troubleshooting-access-violation-exception-while-using-sql-server-compact-database-with-ado-net-provider.aspx

+0

धन्यवाद, मैं है उस लेख को पढ़ें। मैं एसक्यूएल सीई 4.0 का उपयोग कर रहा हूं और लेख में कहा गया है कि "एप्लिकेशन को इन ऑब्जेक्ट्स तक पहुंच को क्रमबद्ध करना चाहिए" मैंने 'SaveChanges() '.. –

+0

पर कॉल को क्रमबद्ध करने के लिए' लॉक 'का उपयोग किया है (लेकिन मुझे अभी भी त्रुटि मिलती है। ।) –

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