سؤال

http://geekswithblogs.net/michelotti/archive/2007 /12/17/117791.aspx

وأنا باستخدام ASP.NET C # مع ومحاولة استخدام LINQ إلى SQL لتحديث إطار البيانات وعرضها على بلوق مرتبطة أعلاه. I إنشاء الحقل الطابع الزمني في الجدول كما ذكرت، وأنا باستخدام الطريقة التالية:

private void updateRecord(TableName updatedRecord)
{
 context db = new context();
 db.TableName.Attach(updatedRecord,true);
 db.SubmitChanges();
}

وسؤالي هو، هل من المفترض ان تعيين حقل الطابع الزمني إلى أي شيء في updatedRecord الخاص بك قبل محاولة استدعاء الأسلوب إرفاق على سياق البيانات الخاصة بك؟

وعند تشغيل هذا الرمز أحصل على استثناء التالية: System.Data.Linq.ChangeConflictException: Row not found or changed. I تحديث كافة المجالات، بما في ذلك المفتاح الأساسي من السجل الذي أنا استكمال قبل تمرير الكائن إلى هذا الأسلوب التحديث. أثناء تصحيح الأخطاء سمة الطابع الزمني للكائن يظهر لاغيا. لست متأكدا ما اذا كان من المفترض أن يكون بهذه الطريقة أم لا.

وكل كتاب والموارد لدي يقول أن هذا هو السبيل لتحقيق ذلك، ولكن أيا منها يذهب إلى قدر كبير من التفصيل حول هذه السمة الطابع الزمني.

وأعرف أن هذا هو سهل وسريع، لذلك إذا علم أحد، واسمحوا لي أن أعرف.

هل كانت مفيدة؟

المحلول

إذا كان لديك عمود الطابع الزمني، ثم لتحديث سجل (من كائن الفانيليا): نعم، أتوقع أن يكون لتعيينه. خلاف ذلك، تفقد القدرة على استخدام الطابع الزمني لفحص التوافق الأمثل.

والفكرة هي أن تأخذ نسخة من الطابع الزمني عند الحصول على عقد من الخاص بك (قطع) الكائن، ثم عند تحديث يمكنك استخدام هذا العمود للتحقق من أن أحدا اخر لم تحريرها الصف.

وهناك نوعان من الحالات الشائعة:

1: إذا كنت فقط تنفيذ عملية قصيرة الأجل، الحصول على السجل من قاعدة البيانات أولا - إجراء التغييرات على الكائن، وببساطة SumbitChanges () [مع كل نفس السياق البيانات]. فإن السياق البيانات التعامل مع التزامن بالنسبة لك.

2: إذا كنت تقوم بفصل الكائن (على سبيل المثال تمريرها إلى تطبيق عميل لبعض الوقت)، ثم استخدام شيء مثل التسلسل (كائنات LINQ إلى SQL تدعم DataContractSerializer (اختياريا؛ تحتاج إلى تمكين عليه)). هكذا تسلسل الكائن في الملقم، نقله إلى العميل - العميل بإجراء تغييرات على النسخة الخاصة بهم ويمر مرة أخرى. خادم deserializes ذلك ويستخدم إرفاق () وSubmitChanges (). سجل في الذاكرة يجب أن لا تزال لديها الطابع الزمني الذي كان عليه عندما المستخرجة من قاعدة البيانات، حتى نتمكن من أداء التوافق الأمثل تمتد في كل وقت تم فصل السجل.

نصائح أخرى

ومنذ كنت أقول إن قمت بإنشاء حقل الطابع الزمني في الجدول، وأنا أتساءل عما إذا كان في حالة حيث تمت إضافة هذا العمود في وقت لاحق، قد لا يتم تعيين خصائص عمود بشكل صحيح. قد ترغب في التحقق من خصائص على عمود الطابع الزمني الخاص بك في مصمم DBML. تأكد من أن:

AutoGenerated = true
Auto-Sync = Always
Time Stamp = True
Update Check = Never

يجب rowversion NOT NULL نوع بيانات الخادم

إذا لم يتم تعيين أن يكون لصناعة السيارات ولدت ومزامن دائما، لن تعاد النسخة التوالي من إدراج وبما انك لم تتغير عندما تم إدراج. على الرغم من أن يتم إنشاء هذه القيمة من قاعدة بيانات DataContext يحتاج إلى معرفة هذا بحيث يمكن التعامل معها بشكل صحيح.

وبالإضافة إلى ذلك، الآن أن لديك عمود الطابع الزمني، يجب تعيين UpdateCheck إلى Never لكافة الأعمدة الأخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top