LINQ to SQL - 使用部分类和方法扩展数据上下文时编译错误

时间:2009-03-04 18:01:30

标签: c# linq linq-to-sql oop partial-classes

我正在尝试使用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);

6 个答案:

答案 0 :(得分:13)

您的两个分部类在不同的命名空间中定义,因此编译器不会“共享”它们。

在DBML设计器的Properties下有一个设置。也许它重置了?

答案 1 :(得分:4)

为了验证Linq中的字段,您需要实现OnValidate方法而不是Insert&更新方法。

例如:

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;
        }
    }

答案 2 :(得分:1)

从方法中删除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 { }
}

答案 3 :(得分:0)

为了澄清,它是部分的类,而不是其中的方法 - 由L2S生成的DataContext类是一个部分类,但不包含任何部分方法**校正**。

为了澄清定义实现部分方法声明的区别,this might help

修改

嗯,我从来没有 - 我之前没有看到/使用过“#region可扩展性方法定义”方法......你每天都学到了什么!无论如何,我链接到的文章是关于部分方法的有用讨论,与L2S分开。

答案 4 :(得分:0)

该错误意味着您正在实现的部分方法尚未在LawEnforcementDataContext类中定义。

当您将表添加到DataContext中时,应自动定义这些方法,查看生成的源(可能是LawEnforcement.designer.cs),查找LawEnforcementDataContext类中标记为#region的区域可扩展性方法定义将定义所有部分方法这里。我希望方法会丢失,尝试删除并重新添加Linq模型中的Course表来生成它们。

答案 5 :(得分:0)

罗尼, 我刚遇到同样的问题。警告:当你在一个实体文件中有多个类时要小心。

检查部分类所在的位置:您是否意外地将定义放在数据上下文括号中,就像我一样?