我正在尝试为Entity Framework实现数据本地化逻辑。例如,如果查询选择Title
属性,则在幕后应引用当前用户文化设置为Title_enGB
或Title_deCH
的列。
为了实现这一点,我想重新编写来自Entity Framework的DbExpression CommandTrees。我以为这些树结构是一种新的通用.NET方法,用于构建跨数据库的插入/更新/选择查询... 但是,现在命名空间System.Data.Metadata
和System.Data.Common.CommandTrees
中所有相关的构造函数/工厂在System.Data.Entity.dll
中都是内部的!(在MSDN文档中记录为public,例如:DbExpressionBuilder
)。
是否有人知道如何使用或不使用查询树重写实现此查询操作?
我的期望代码:(public class DbProviderServicesWrapper : DbProviderServices
)
/// <summary>
/// Creates a command definition object for the specified provider manifest and command tree.
/// </summary>
/// <param name="providerManifest">Provider manifest previously retrieved from the store provider.</param>
/// <param name="commandTree">Command tree for the statement.</param>
/// <returns>
/// An exectable command definition object.
/// </returns>
protected override DbCommandDefinition CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree)
{
var originalCommandTree = commandTree as DbQueryCommandTree;
if (originalCommandTree != null)
{
var expression = new MyCustomQueryRewriter(originalTree.MetadataWorkspace).Visit(originalCommandTree.Query);
commandTree = DbQueryCommandTree.FromValidExpression(originalCommandTree.MetadataWorkspace, originalCommandTree.DataSpace, expression);
}
// TODO: UpdateCommand/InsertCommand
var inner = this.Inner.CreateCommandDefinition(providerManifest, commandTree);
var def = new DbCommandDefinitionWrapper(inner, (c, cd) => new DbCommandWrapper(c));
return def;
}
更新
在一张表中拥有两个标题列并不太好,但在第一步中更容易实现。稍后我会使用另一个表连接本地化字段,这样主表将只包含不变的数据。