LINQ to 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. Возможно, это сброс?

Другие советы

Чтобы проверить поля в Linq, вам необходимо реализовать метод OnValidate, а не Insert & amp; Обновить методы.

Например:

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 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. Определения метода расширяемости. Будут определены все частичные методы. Вот. Я ожидаю, что методы будут отсутствовать, попробуйте удалить и повторно добавить таблицу Course в вашей модели Linq, чтобы сгенерировать их.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top