LINQ إلى SQL كيف يمكنني إرسال التغييرات بعد إغلاق الاتصال؟

StackOverflow https://stackoverflow.com//questions/11692782

  •  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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top