1

約 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; }
}

SqlMetalDataContext クラスを動的に生成するカスタム スクリプトを使用しています。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 がマップされていません。

そのブログ記事を書いてから、何か変わったことはありますか? 私は何が欠けていますか?

4

0 に答える 0