約 150 のテーブルを含むバックエンド データベースを使用した、かなり広範な LINQ-to-SQL マッピングがあります。CompanyCode
ほとんどすべてのテーブルには、すべてのテーブルにわたって一種のパーティションとして機能する、という共通のプロパティがあります。
context.GetTable<T>
現在、特定のエンティティ タイプのレコードを取得するために使用する検証ツールを実装しています。でフィルタリングしたいCompanyCode
のですが、一般的には次のようになります。
context.GetTable<T>().Where(t => t.CompanyCode == "1234").ToList();
という名前のカスタム抽象基本クラスが既にあるので、この記事で説明されているように、LINQ クラスでオーバーライドされるCPSQLEntityBase
カスタム仮想プロパティを追加することを考えました。CompanyCode
public abstract class CPSQLEntityBase
{
public virtual string CompanyCode { get; set; }
}
SqlMetal
DataContext クラスを動的に生成するカスタム スクリプトを使用しています。public string CompanyCode
そのため、 withのすべてのインスタンスを検索/置換するコマンドを追加public override string CompanyCode
して、基本クラスの仮想プロパティをオーバーライドするのは簡単でした。たとえば、そのうちの 1 つが次のようになります。
public partial class Employee : CPSQLEntityBase, INotifyPropertyChanging, INotifyPropertyChanged
{
...
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_CompanyCode", DbType="VarChar(4) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
[global::System.Runtime.Serialization.DataMemberAttribute(Order=124)]
public override string CompanyCode
{
get
{
return this._CompanyCode;
}
set
{
...
}
}
...
}
すべてをまとめると、LINQPad で小さなテスト スクリプトを作成しました。このスクリプトはEmployee
、ジェネリック メソッドを使用してエンティティを要求できるようにする必要がありますが、 CompanyCode
. これが私のサンプルスクリプトです:
void Main()
{
...
Test<Employee>(context);
}
public void Test<T>(MyDataContext context)
where T : CPSQLEntityBase
{
var result = context.GetTable<T>().Where(t => t.CompanyCode == "1234").ToList();
}
ただし、上記のコードを実行すると、例外が発生します。
クラス メンバ CPSQLEntityBase.CompanyCode がマップされていません。
そのブログ記事を書いてから、何か変わったことはありますか? 私は何が欠けていますか?