1

我们有一个相当广泛的 LINQ-to-SQL 映射,后端数据库包含大约 150 个表。几乎所有的表都有一个共同的属性,称为CompanyCodewhich 作为跨所有表的一种分区。

我目前正在实现一个验证工具,context.GetTable<T>用于检索特定实体类型的记录。我想过滤CompanyCode,但一般来说,例如:

context.GetTable<T>().Where(t => t.CompanyCode == "1234").ToList();

因为,我们已经有一个名为的自定义抽象基类CPSQLEntityBase,所以我的想法是添加一个自定义虚拟属性CompanyCode,该属性将在 LINQ 类中被覆盖,如本文所述

public abstract class CPSQLEntityBase
{
    public virtual string CompanyCode { get; set; }
}

我正在使用一个自定义脚本,用于SqlMetal动态生成我们的 DataContext 类。所以添加一个命令来查找/替换所有实例是微不足道的public string CompanyCodepublic override string CompanyCode这样它们就会覆盖基类中的虚拟属性。例如,以下是其中一个的样子:

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