8

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

7 回答 7

14

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

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

于 2009-03-04T20:38:13.600 回答
4

为了验证 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;
        }
    }
于 2009-03-04T20:31:52.633 回答
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 { }
}
于 2009-03-04T18:04:05.873 回答
0

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

为了澄清定义实现部分方法声明的区别,这可能会有所帮助

编辑

好吧,我从来没有 - 我以前没有见过/使用过“#region 可扩展性方法定义”方法......你每天都会学到一些东西!无论如何,我链接到的文章是关于一般部分方法的有用讨论,与 L2S 分开。

于 2009-03-04T18:14:38.313 回答
0

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

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

于 2009-03-04T18:16:01.117 回答
0

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

检查部分类的位置:您是否像我一样不小心将定义放在数据上下文括号中?

于 2010-07-11T05:48:47.677 回答
0

所以,当我遇到这个错误时,我正在使用源生成器。

问题是在生成器的源代码中,我需要添加命名空间。

string source = $@" namespace ORMSoda.Tests.TestProgram {{ public static partial class Program {{ static partial void HelloFrom(string name) {{ System.Console.WriteLine($""Generator says: Hi from '{{name}}'""); }} }} }} ";

于 2021-11-03T22:14:43.660 回答