Я пытаюсь реализовать логику локализации данных для Entity Framework. Таким образом, если, например, запрос выбирает свойство Title
, за кулисами он должен ссылаться на столбец Title_enGB
или Title_deCH
в зависимости от текущей культуры пользователя.
Чтобы достичь этого, я бы хотел переписать команды DbExpression CommandTrees из Entity Framework. Я думал, что эти деревья являются новым распространенным способом .NET для создания кросс-баз данных вставки/обновления/выбора запросов. Но теперь все соответствующие конструкторы/фабрики в пространства имен System.Data.Metadata
и System.Data.Common.CommandTrees
в System.Data.Entity.dll
являются внутренними!! (В msdn документированы как общедоступные, например: 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;
}
Update
Наличие двух столбцов заголовка на одной таблице не круто, но его проще реализовать на первом этапе. Позже я присоединяюсь к другой таблице с локализованными полями, поэтому основная таблица будет содержать только инвариантные данные.