LINQ to SQL-部分的なクラスとメソッドでデータコンテキストを拡張する際のコンパイルエラー
-
03-07-2019 - |
質問
datacontext.designer.csファイルのExtensibility Method Definitionsを使用して検証を試みています。
だから私は新しいファイルを作成し、このコードを追加しました:
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);
解決
2つの部分クラスは異なる名前空間で定義されているため、コンパイラはそれらを「共有」しません。
これには、DBMLデザイナーの[プロパティ]の下に設定があります。おそらくリセットされますか?
他のヒント
Linqのフィールドを検証するには、Insert&ではなくOnValidateメソッドを実装する必要があります。更新方法。
例:
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
キーワードを削除します-生成されたクラスには部分的なメソッドがありません。
編集:部分的なメソッドは、次のように定義されている場合にのみ機能します:
partial class Foo
{
partial void foo();
}
partial class Foo
{
partial void foo() { }
}
宣言の1つは、抽象メソッドまたはインターフェイスメソッドの宣言のように記述する必要があります。コンパイラーは、実装で1つの部分メソッドを見つけ、他の場所で一致する部分メソッド宣言を見つけることができない場合、このエラーを生成します。
編集:ここで確認することがあります-パラメーター Course
が2つの宣言のいずれかとまったく同じタイプでない可能性はありますか?つまり、次のようなことが発生した可能性があります。
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にテーブルを追加するときに自動的に定義される必要があります。ここに。メソッドが欠落することを期待しています。それらを生成するには、LinqモデルのCourseテーブルを削除して再追加してみてください。
明確にするために、部分的なのはクラスであり、その中のメソッドではありません-L2Sによって生成されたDataContextクラスは部分的なクラスですが、部分的なメソッドは含まれません**以下の修正**。
部分的なメソッド宣言の定義と実装の違いを明確にするために、これが役立つ場合があります。
編集
まさか今まで-「#region Extensibility Method Definitions」」を見たり使ったりしなかった前の方法...あなたは毎日何かを学びます!とにかく、私がリンクした記事は、L2Sとは別に、一般的な部分メソッドに関する有用な議論です。
ロニー、 私はちょうどこの同じ問題に遭遇しました。警告:1つのエンティティファイルに複数のクラスがある場合は注意してください。
部分クラスの場所を確認します。誤って定義をデータコンテキストブラケット内に入れましたか?