Estoy tratando de implementar la lógica de localización de datos para Entity Framework. De modo que si, por ejemplo, una consulta selecciona la propiedad Title
, detrás de las escenas debe hacer referencia a la columna Title_enGB
o Title_deCH
dependiendo de la cultura del usuario actual.manipulación de consultas EntityFramework, envoltura del proveedor db, árboles de expresión db
Para lograr esto, me gustaría volver a escribir los CommandTrees de DbExpression desde Entity Framework. Pensé que estos trees son una nueva forma común de .NET para crear una base de datos cruzada insertar/actualizar/seleccionar consultas ... Pero ahora todos los constructores/fábricas relevantes en los espacios de nombres System.Data.Metadata
y System.Data.Common.CommandTrees
en System.Data.Entity.dll
son internos. (En msdn documentado como público, como: DbExpressionBuilder
).
¿Alguien tiene una idea para lograr esta manipulación de consultas con o sin reescritura del árbol de consultas?
mi código deseado: (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;
}
actualización
Tener dos columnas de títulos en una tabla no es bueno, pero es más fácil de implementar en un primer paso . Más tarde me uniré a otra tabla con los campos localizados, por lo que la tabla principal solo contendrá datos invariables.
Hay dos cuestiones dependientes de la cultura que parece ignorar con su localización. (1) El precio se expresa en moneda estadounidense. (2) Las cantidades se expresan en el sistema métrico. – smartcaveman