Réduire automatiquement les valeurs Char(N) dans Entity Framework
La réduction des valeurs récupérées pour les colonnes char(N) est essentielle lorsque vous travaillez avec des bases de données qui stocker les valeurs de texte dans des formats de longueur fixe. Cet article explique comment configurer Entity Framework (EF) pour réduire automatiquement ces valeurs, garantissant ainsi la cohérence et l'efficacité de vos applications.
EF fournit une API complète pour mapper les entités de données aux colonnes de la base de données, mais elle manque d'éléments intégrés. fonctionnalité de coupe automatique. Pour résoudre ce problème, une solution utilisant des intercepteurs a été proposée. Cette approche exploite le mécanisme d'interception d'EF pour modifier les requêtes de base de données et appliquer les règles de découpage de manière dynamique.
L'intercepteur proposé, StringTrimmerInterceptor, intercepte les arbres de requêtes et les modifie pour couper les propriétés des chaînes. Il vérifie le type EDM des propriétés et, s'il correspond aux types de chaîne spécifiés (tels que nvarchar ou char), les remplace par des appels Trim(expression). Cela garantit que toutes les propriétés de chaîne extraites de la base de données sont automatiquement supprimées.
Pour utiliser StringTrimmerInterceptor, il doit être enregistré auprès de la configuration d'Entity Framework. Ceci peut être réalisé via DbConfiguration ou Configuration basée sur le code. Placer une classe MyConfiguration avec la méthode AddInterceptor dans le même assembly que le contexte EF activera l'intercepteur.
L'implémentation de StringTrimmerInterceptor et le code pour l'enregistrer sont fournis dans l'extrait suivant :
using System.Data.Entity; using System.Data.Entity.Core.Common.CommandTrees; using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder; using System.Data.Entity.Core.Metadata.Edm; using System.Data.Entity.Infrastructure.Interception; using System.Linq; namespace FixedLengthDemo { public class StringTrimmerInterceptor : IDbCommandTreeInterceptor { private static readonly string[] _typesToTrim = { "nvarchar", "varchar", "char", "nchar" }; public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext) { if (interceptionContext.OriginalResult.DataSpace == DataSpace.SSpace) { var queryCommand = interceptionContext.Result as DbQueryCommandTree; if (queryCommand != null) { var newQuery = queryCommand.Query.Accept(new StringTrimmerQueryVisitor()); interceptionContext.Result = new DbQueryCommandTree( queryCommand.MetadataWorkspace, queryCommand.DataSpace, newQuery); } } } private class StringTrimmerQueryVisitor : DefaultExpressionVisitor { public override DbExpression Visit(DbNewInstanceExpression expression) { var arguments = expression.Arguments.Select(a => { var propertyArg = a as DbPropertyExpression; if (propertyArg != null && _typesToTrim.Contains(propertyArg.Property.TypeUsage.EdmType.Name)) { return EdmFunctions.Trim(a); } return a; }); return DbExpressionBuilder.New(expression.ResultType, arguments); } } } public class MyConfiguration : DbConfiguration { public MyConfiguration() { AddInterceptor(new StringTrimmerInterceptor()); } } }
En implémentant StringTrimmerInterceptor et en l'enregistrant avec la configuration EF, vous pouvez facilement couper les valeurs de la colonne char(N) sans avoir besoin d'informations explicites. Modifications des requêtes LINQ to Entities. Cette approche garantit que les données découpées sont renvoyées de manière cohérente dans toute votre application, simplifie la maintenance et améliore les performances en réduisant la surcharge de la base de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!