我们有一个相当广泛的 LINQ-to-SQL 映射,后端数据库包含大约 150 个表。几乎所有的表都有一个共同的属性,称为CompanyCode
which 作为跨所有表的一种分区。
我目前正在实现一个验证工具,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 CompanyCode
,public 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 未映射。
自从写了那篇博客文章后,有什么变化吗?我错过了什么?