الذرة الحفاظ على العداد باستخدام الفرعية سونيك ActiveRecord
-
26-09-2019 - |
سؤال
أنا في محاولة لمعرفة الطريقة الصحيحة الذرة الزيادة في عداد طاولة واحدة واستخدام أن زيادة قيمة لها الزائفة العرض فقط معرف سجل في آخر.
ما لدي هو الشركات وطاولة وظائف الجدول.أريد كل شركة أن يكون هو نفسه من job_numbers.لدي زيادة تلقائية job_id ، ولكن هذه الأرقام هي مشتركة بين جميع الشركات.أي:أرقام الوظائف وينبغي عموما الزيادة دون ثغرات لكل شركة.
أي:
- الشركات(company_id, next_job_number)
- وظائف(company_id, job_id, job_number)
حاليا أنا أقوم بهذا (كطريقة على جزئية الوظيفة الدرجة):
public void SaveJob()
{
using (var scope = new System.Transactions.TransactionScope())
{
if (job_id == 0)
{
_db.Update<company>()
.SetExpression("next_job_number").EqualTo("next_job_number+1")
.Where<company>(x => x.company_id == company_id)
.Execute();
company c = _db.companies.SingleOrDefault(x => x.company_id == company_id);
job_number = c.next_job_number;
}
// Save the job
this.Save();
scope.Complete();
}
}
يبدو للعمل ، ولكن لست متأكدا إذا كان هناك عثرات هنا ؟ تشعر أنها مجرد خطأ ولكن أنا لا أعرف كيف آخر للقيام بذلك.
أي نصيحة تقدير.
المحلول
أولا ،
يجب عليك استخدام TransactionScope بالتزامن مع SharedDbConnectionScope أو المعاملات الخاصة بك لن تعمل كما هو متوقع.
ثانيا ،
وأود أن استخدام نهج آخر مع بيان واحد دون الحاجة إلى حفظ job_id مع الشركة)
حفظ سجل مع job_number = 0
تحديث سجل مع شيء من هذا القبيل
تحديث وظائف مجموعة JOB_NUMBER = (SELECT MAX(job_number)+1 من الوظائف حيث company_id = 12345) حيث job_id = " + هذا.job_id;
(تحتاج فقط إلى تحويل هذا الاستعلام دون سرعة الصوت في بناء الجملة, لا تستخدم subsonic3) يجب أن نضمن أن عدد الوظائف هي فريدة من نوعها لكل شركة (إذا كنت التفاف كل حفظ و تحديث القيادة في المعاملة واستخدام طاولة قفل).
نصائح أخرى
باستخدام رمز الحيوي والحصول على أعلى قيمة يمكن أن تكون محفوفة بالمخاطر (المحتملة قيم مكررة) على ارتفاع حجم متعدد المستخدمين نظام.
نهج آخر يمكن إنشاء جدول جديد مع اثنين من أعمدة ، واحد حرف PK, والآخر صحيح لتخزين ذات القيمة الأخيرة.في كل مرة كنت تريد قيمة جديدة, زيادة قيمة في سجل الشركة ذات الصلة واستخدام أن قيمة رقم طلبك.حرف PK وستضم شيئا مثل:
"LAST_ORDER_NUMBER_COMPANY_" + company_id
يجب إجراء مخزن استدعاء تلقائيا إما يبدأ رقما قياسيا جديدا للمرة الأولى الشركة قد أمر ، أو الزيادات ذلك لاحقا أوامر ، وإرجاع النظام الجديد عدد القيمة مرة أخرى.