我正在尝试使用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);
答案 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)
罗尼, 我刚遇到同样的问题。警告:当你在一个实体文件中有多个类时要小心。
检查部分类所在的位置:您是否意外地将定义放在数据上下文括号中,就像我一样?