LINQ to SQL - ошибка компиляции при расширении контекста данных частичным классом и методами

Я пытаюсь использовать определения метода расширяемости из моего файла 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 полностью берет на себя сгенерированный код.

РЕДАКТИРОВАТЬ

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

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

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

person Ronnie Overby    schedule 04.03.2009    source источник
comment
Ваше правка, показывающая частичные определения методов, разрушает мою догадку, что они отсутствуют. Еще одно предположение, есть ли у вас класс Course в нескольких пространствах имен? Правильный ли класс бронирования?   -  person ScottS    schedule 04.03.2009
comment
Нет, у меня только 1 курс. оговорка. принудительное исполнение. курс правильный.   -  person Ronnie Overby    schedule 04.03.2009
comment
Может быть, лучше всего преобразовать эту проблему во что-то законченное, что мы сможем увидеть - можете ли вы удалить как можно больше кода, чтобы свести это к небольшому примеру проблемы?   -  person Andrew Hare    schedule 04.03.2009
comment
Я не знаю, что еще включить. Я начинаю немного волноваться. Teamviewer?   -  person Ronnie Overby    schedule 04.03.2009
comment
К сожалению, ответ на ваш вопрос заключается в том, что компилятор не может сопоставить ваш частичный метод со своим партнером. Причину, по которой это происходит, невозможно определить из того, что вы опубликовали - должно быть что-то еще, что вы можете опубликовать, что даст нам некоторые подсказки.   -  person Andrew Hare    schedule 04.03.2009


Ответы (6)


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

Для этого есть настройка в разделе «Свойства» в дизайнере DBML. Может, сбросить?

person leppie    schedule 04.03.2009
comment
То же самое случилось со мной примерно месяц назад :) - person leppie; 05.03.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;
        }
    }
person rmw    schedule 04.03.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 { }
}
person Andrew Hare    schedule 04.03.2009
comment
Я сослался на многие другие проекты, в которых я делал то же самое, что и здесь. Раньше я использовал ключевое слово partial, и все они отлично работают. Когда я удалил ключевое слово partial в этом примере, это вызвало еще несколько ошибок. - person Ronnie Overby; 04.03.2009
comment
Можете ли вы опубликовать другие половинки частичных методов из сгенерированного файла? - person Andrew Hare; 04.03.2009
comment
Первая ошибка, на которую он жалуется после удаления ключевого слова partial: «System.Data.Linq.DataContext» не содержит конструктора, который принимает аргументы «0» --- Как я уже сказал, это как если бы новый класс скрывает сгенерированный один. - person Ronnie Overby; 04.03.2009
comment
Других классов с именем Course в других пространствах имен нет. - person Ronnie Overby; 04.03.2009

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

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

person ScottS    schedule 04.03.2009
comment
Нет, они все есть. Я скопировал и вставил определение в свой новый файл, где реализовал методы. - person Ronnie Overby; 04.03.2009

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

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

Изменить

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

person Duckboy    schedule 04.03.2009
comment
На самом деле в сгенерированном коде есть региональный блок под названием Extensibility Method Definitions, где он определяет тонну частичных методов (вставка, обновление, удаление для каждой таблицы) - person Ronnie Overby; 04.03.2009
comment
Да, спасибо, Ронни - я заметил это и вчера упомянул об этом в своей редакции, примерно в то же время, когда вы оставили этот комментарий :) - person Duckboy; 05.03.2009
comment
Итак, кхм, есть ли шанс получить +1 за то, что скромно признал мою ошибку и добавил исправление? Или я получаю -1 за то, что имел наглость попросить +1, что привело бы к нулевому чистому эффекту? Просто интересно, как здесь все устроено! - person Duckboy; 05.03.2009

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

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

person MAbraham1    schedule 11.07.2010