LINQ to SQL - ошибка компиляции при расширении контекста данных частичным классом и методами - PullRequest
7 голосов
/ 04 марта 2009

Я пытаюсь использовать определения метода расширяемости из моего файла 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 to SQL, он жалуется на то, что мои типы сущностей больше не существуют. Это как если бы частичный класс LawEnforcementDataContext полностью захватил сгенерированный код.

EDIT

Вот другие половины частичных объявлений из сгенерированного кода:

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

    // the methods
    partial void InsertCourse(Course instance);
    partial void UpdateCourse(Course instance);

Ответы [ 6 ]

13 голосов
/ 04 марта 2009

Два ваших частичных класса определены в разных пространствах имен, поэтому компилятор не разделяет их.

Для этого существует настройка в разделе «Свойства» в конструкторе DBML. Возможно, это сброс?

4 голосов
/ 04 марта 2009

Для проверки полей в Linq вам необходимо реализовать метод OnValidate, а не методы Insert & Update.

Например:

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;
        }
    }
1 голос
/ 04 марта 2009

Удалите ключевое слово 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 { }
}
0 голосов
/ 11 июля 2010

Ронни, Я просто столкнулся с этой же проблемой. Предупреждение: будьте осторожны, когда у вас есть несколько классов в одном файле сущности.

Проверьте, где расположен частичный класс: случайно ли вы поместили определение в скобки контекста данных, как я?

0 голосов
/ 04 марта 2009

Эта ошибка означает, что реализуемый вами частичный метод не был определен в классе LawEnforcementDataContext.

Эти методы должны определяться автоматически, когда вы добавляете таблицы в ваш DataContext, ищите в сгенерированном источнике (вероятно, LawEnforcement.designer.cs) область внутри класса LawEnforcementDataContext, помеченную #region. Определения метода расширяемости. Все частичные методы будут определены. Вот. Я ожидаю, что методы будут отсутствовать, попробуйте удалить и повторно добавить таблицу Course в вашей модели Linq, чтобы сгенерировать их.

0 голосов
/ 04 марта 2009

Чтобы уточнить, это частичный класс, а не методы внутри него - класс DataContext, сгенерированный L2S, является частичным классом, но не содержит каких-либо частичных методов ** исправление ниже **.

Для уточнения различий , определяющих и , реализующих частичные объявления методов, это может помочь .

Редактировать

Ну, я никогда ... Я не видел / не использовал методы "#region Extensibility Method Definitions" раньше ... вы чему-то учитесь каждый день! В любом случае, статья, на которую я ссылаюсь, является полезным обсуждением частичных методов в целом, отдельно от L2S.

...