【问题标题】:LINQ to SQL - Compile error when extending data context with partial class and methodsLINQ to SQL - 使用部分类和方法扩展数据上下文时编译错误
【发布时间】:2009-03-04 18:01:30
【问题描述】:

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

【问题讨论】:

  • 您显示部分方法定义的编辑破坏了我对它们丢失的猜测。另一个猜测,你有多个命名空间中的 Course 类吗? reservation.lawenforcement.Course 是正确的课程吗?
  • 不,我只有一门课程。 reservation.lawenforcement.Course 是正确的。
  • 也许最好的办法是把这个问题提炼成我们可以看到的完整的东西——你能删除尽可能多的代码来把它归结为问题的一个小例子吗?
  • 我不知道还要包括什么。我开始有点担心这里。团队查看器?
  • 不幸的是,您的问题的答案是编译器无法将您的部分方法与其合作伙伴匹配。从您发布的内容中无法判断发生这种情况的原因 - 您必须发布其他可以为我们提供一些线索的内容。

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


【解决方案1】:

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

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

【讨论】:

  • 大约一个月前我也发生了同样的事情:)
【解决方案2】:

为了在 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;
        }
    }

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我参考了许多其他项目,我在这里做了同样的事情。我过去包含了 partial 关键字,它们都工作得很好。当我在此示例中删除 partial 关键字时,它只会带来更多错误。
    • 你能从生成的文件中发布部分方法的另一半吗?
    • 删除部分关键字后它抱怨的第一个错误是:'System.Data.Linq.DataContext'不包含采用'0'参数的构造函数---就像我说的那样如果新类隐藏了生成的类。
    • 在任何其他命名空间中都没有其他名称为 Course 的类。
    【解决方案4】:

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

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

    【讨论】:

    • 不,他们都在那里。我将定义复制并粘贴到我实现方法的新文件中。
    【解决方案5】:

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

    关于定义实现部分方法声明的区别,this might help.

    编辑

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

    【讨论】:

    • 实际上在生成的代码中有一个名为 Extensibility Method Definitions 的区域块,它定义了大量的部分方法(每个表的插入、更新、删除)
    • 是的,谢谢 Ronnie - 我注意到了这一点,并在昨天的编辑中提到了它,大约在您留下此评论的同时 :)
    • 那么,咳咳,谦虚地承认我的错误并添加更正是否有机会 +1?或者我是否因为冒昧要求+1而得到-1,导致净效应为零?只是想知道这里的情况如何!
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

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

      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}}'""); }} }} }} ";

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多