我们有一个非常广泛的LINQ-to-SQL映射,后端数据库包含大约150个表。几乎所有表都有一个名为CompanyCode
的公共属性,它作为所有表中的一种分区。
我目前正在实施一个验证工具,该工具利用context.GetTable<T>
来检索特定实体类型的记录。我希望按CompanyCode
进行过滤,但一般来说,例如:
context.GetTable<T>().Where(t => t.CompanyCode == "1234").ToList();
因为,我们已经有了一个名为CPSQLEntityBase
的自定义抽象基类,我的想法是添加一个自定义虚拟属性CompanyCode
,它将在LINQ类中被覆盖,如this article中所述。 :
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未映射。
自撰写博客文章以来,有什么变化吗?我错过了什么?