LINQ إلى SQL - خطأ في الترجمة عند توسيع سياق البيانات بفئة وأساليب جزئية

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

سؤال

أحاول استخدام تعريفات أسلوب القابلية للتوسعة من ملف datacontext.designer.cs الخاص بي لإجراء بعض التحقق من الصحة.

لذلك قمت بإنشاء ملف جديد وأضفت هذا الكود:

public partial class LawEnforcementDataContext : System.Data.Linq.DataContext
{

    partial void InsertCourse(Course instance) // this definition copied from generated file
    {
        ValidateCourse(instance);
        this.ExecuteDynamicInsert(instance);
    }

    partial void UpdateCourse(Course instance) // this definition copied from generated file
    {
        ValidateCourse(instance);
        this.ExecuteDynamicUpdate(instance);
    }

    private void ValidateCourse(Course instance)
    {
        if (instance.StartDate > instance.EndDate)
        {
            throw new ApplicationException("Start date cannot be later than end date.");
        }
    }
}

لا أستطيع التجميع بسبب هذه الأخطاء:

Error   1   No defining declaration found for implementing declaration of partial method 'LawEnforcementDataContext.InsertCourse(reservation.lawenforcement.Course)'
Error   2   No defining declaration found for implementing declaration of partial method 'LawEnforcementDataContext.UpdateCourse(reservation.lawenforcement.Course)'

لا أرى ما أفعله خطأ.لقد فعلت هذا من قبل.أيضًا، بعد إضافة الكود أعلاه، في الكود الذي يشير إلى الفئات التي تم إنشاؤها بواسطة LINQ إلى SQL، فإنه يشكو من أن أنواع الكيانات الخاصة بي لم تعد موجودة.يبدو الأمر كما لو أن الفئة الجزئية LawEnforcementDataContext تتولى بالكامل التعليمات البرمجية التي تم إنشاؤها.

يحرر

فيما يلي النصف الآخر من الإعلانات الجزئية من الكود الذي تم إنشاؤه:

    // the class
    public partial class LawEnforcementDataContext : System.Data.Linq.DataContext

    // the methods
    partial void InsertCourse(Course instance);
    partial void UpdateCourse(Course instance);
هل كانت مفيدة؟

المحلول

يتم تعريف

ولديك فئتين جزئية في النطاقات المختلفة، وبالتالي فإن المترجم لا نصيب 'لهم.

ويوجد إعداد ضمن خصائص في المصمم DBML لهذا الغرض. ربما كان إعادة تعيين؟

نصائح أخرى

في أجل التحقق من صحة الحقول في ينق، تحتاج إلى تنفيذ أسلوب OnValidate لا إدراج وتحديث الأساليب.

وعلى سبيل المثال:

partial void OnValidate(System.Data.Linq.ChangeAction action)
    {
        //All content items need titles
        if (Description == null || Description == "")
            throw new Exception("The description field is empty!");

        //Content types of image need...images
        if (ContentItemTypeId == (int)ContentItemTypes.Image && ImageData == null)
            throw new Exception("An image is required in order to save this content item!");

        //New Content Items don't have ids.  If a new one comes through, set the default values for it.
        if (this.ContentItemId == 0)
        {
            this.CreatedOn = DateTime.Now;
            this.LastUpdatedOn = DateTime.Now;
            this.IsDeletable = true;
        }
    }

مسح ال partial الكلمة الأساسية من أساليبك - لا تحتوي الفئة التي تم إنشاؤها على أي أساليب جزئية.

يحرر: تعمل الطرق الجزئية فقط عندما يتم تعريفها على النحو التالي:

partial class Foo
{
    partial void foo();
}

partial class Foo
{
    partial void foo() { }
}

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

يحرر: هنا شيء للتحقق - هل من الممكن أن المعلمة Course ليس هو نفس النوع بالضبط في أحد الإعلانين؟بمعنى آخر هل من الممكن أن يكون قد حدث شيء من هذا القبيل:

partial class Foo
{
    partial void foo(Biz.Parameter p);
}

partial class Foo
{
    partial void foo(Baz.Parameter p) { }
}

namespace Baz
{
    class Parameter { }
}

namespace Biz
{
    class Parameter { }
}

وهذا الخطأ يعني أن طريقة الجزئي الخاص بتنفيذ لم يتم تعريف في فئة LawEnforcementDataContext.

وهذه الأساليب يجب أن تكون محددة تلقائيا عند إضافة الجداول إلى DataContext الخاص، والبحث في مصدر ولدت (ربما LawEnforcement.designer.cs) لمنطقة داخل الطبقة LawEnforcementDataContext #region المسمى سيتم تحديد طريقة التمدد تعريفات جميع الطرق الجزئية هنا. أتوقع أن تكون الطرق في عداد المفقودين، حاول إزالة وإعادة مضيفا الجدول دورة في نموذج ينق لتوليد لهم.

للتوضيح، هذه هي الفئة الجزئية، وليس الأساليب الموجودة فيها - فئة DataContext التي تم إنشاؤها بواسطة L2S هي فئة جزئية ولكنها لا تحتوي على أي أساليب جزئية ** التصحيح أدناه **.

وللتوضيح حول الفرق تعريف و تنفيذ إعلانات الطريقة الجزئية, هذا قد يساعد.

يحرر

حسنًا، لم يسبق لي أن رأيت/استخدمت أساليب "#region Extensibility Method Definitions" من قبل...تتعلم شيئا ما كل يوم!على أي حال، المقالة التي قمت بالارتباط بها هي مناقشة مفيدة حول الطرق الجزئية بشكل عام، منفصلة عن L2S.

وروني، ركضت للتو في هذه المسألة نفسها. تحذير: كن حذرا عندما يكون لديك فئات متعددة في ملف كيان واحد

وتحقق حيث الطبقة الجزئية الواقعة: هل وضعت عن طريق الخطأ في تعريف داخل سياق البيانات بين قوسين كما فعلت

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