LINQ إلى SQL كيف يمكنني إرسال التغييرات بعد إغلاق الاتصال؟
-
12-12-2019 - |
سؤال
أقوم بالوصول إلى قاعدة بيانات باستخدام LINQ، وأقوم بإجراء تغييرات على السجلات.أقوم باسترداد السجلات مثل هذا:
using(var db = new DatabaseDataContext(connectionString))
{
var query =
from item in db.table
where item.senddate == null
select item;
results = query.ToList();
}
بعد الحصول على العناصر، أقوم بمعالجة كل عنصر، الأمر الذي يتطلب الاتصال بخدمة ويب، ويمكن أن يستغرق أكثر من دقيقة لكل سجل.عندما يتم تحديث السجل، أحتاج إلى إرسال التغييرات، لكنني لست متأكدًا من كيفية المتابعة.حاليا أقوم بما يلي:
List<table> toProcess = QueryDb(); // Calls the previously displayed method
foreach (table item in toProcess)
{
item.result = QueryDb(item.xmlrequest);
PostToDb(item);
}
...
private bool PostToDb(table submit)
{
submit.senddate = DateTime.Now;
using (var db = new DatabaseDbDataContext(connectionString))
{
db.SubmitChanges();
}
return result;
}
db.SubmitChanges()
لا يرسل أي تغييرات، لكنني لم أقم بالفعل بتعيين أن الكائن "إرسال" يحمل التغييرات.كيف يمكنني إرسال التغييرات التي تم إجراؤها على الإدخال دون إبقاء اتصال قاعدة البيانات مفتوحًا لعدة دقائق أثناء معالجة الملفات واحدًا تلو الآخر؟
شكرا لتقديمك المساعده.
تم حلها جزئيا
لا أعتقد أن هذا هو الحل الأفضل، لكنني تمكنت من جعله يعمل مع التغييرات التالية على الكود الخاص بي:
private bool PostToDb(table submit)
{
using (var db = new DatabaseDataContext(connectionString))
{
var query =
from item in db.table
where item.iprimaryid.Equals(submit.iprimaryid)
select item;
// There can only be one result, but this was the only
// way I could think to access it
foreach (var item in query)
{
item.senddate = DateTime.Now;
item.result = submit.result;
}
db.SubmitChanges();
}
return result;
}
المحلول
تحتاج إلى استخدام Attach
طريقة لك DataContext
.إذن خطواتك هي:
1) كائن الاستعلام من قاعدة البيانات باستخدام مثيل واحد من الخاص بك DataContext
2) إجراء بعض التغييرات
3) إنشاء الجديد DataContext
مثيل وإرفاق الكيانات المعدلة.
using (var dataContext = new DataContext(ConnectionString))
{
dataContext.TABLE_NAME.Attach(modifiedEntity);
dataContext.SubmitChanges();
}
نصائح أخرى
هل يمكنك الإعلان عن سياق بياناتك في نطاق خارجي وتمريره كمعلمة إلى الطرق التي تحتاج إلى الوصول إلى قاعدة البيانات؟شيء من هذا القبيل:
using (var db = new DatabaseDbDataContext(connectionString))
{
var toProcess = QueryDb(db);
// Do whatever processing you need to do...
toProcess.ForEach(t => t.SendDate = DateTime.Now);
db.SubmitChanges();
}