الذرة الحفاظ على العداد باستخدام الفرعية سونيك ActiveRecord

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

سؤال

أنا في محاولة لمعرفة الطريقة الصحيحة الذرة الزيادة في عداد طاولة واحدة واستخدام أن زيادة قيمة لها الزائفة العرض فقط معرف سجل في آخر.

ما لدي هو الشركات وطاولة وظائف الجدول.أريد كل شركة أن يكون هو نفسه من 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 مع الشركة)

  1. حفظ سجل مع job_number = 0

  2. تحديث سجل مع شيء من هذا القبيل

    تحديث وظائف مجموعة JOB_NUMBER = (SELECT MAX(job_number)+1 من الوظائف حيث company_id = 12345) حيث job_id = " + هذا.job_id;

(تحتاج فقط إلى تحويل هذا الاستعلام دون سرعة الصوت في بناء الجملة, لا تستخدم subsonic3) يجب أن نضمن أن عدد الوظائف هي فريدة من نوعها لكل شركة (إذا كنت التفاف كل حفظ و تحديث القيادة في المعاملة واستخدام طاولة قفل).

نصائح أخرى

باستخدام رمز الحيوي والحصول على أعلى قيمة يمكن أن تكون محفوفة بالمخاطر (المحتملة قيم مكررة) على ارتفاع حجم متعدد المستخدمين نظام.

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

"LAST_ORDER_NUMBER_COMPANY_" + company_id

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

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