使用实体框架拦截器自动修剪 Char(N) 值
在这种情况下,您遇到了一个挑战,其中文本值存储为在实体框架中检索时,外部数据库中的 char(N) 字段需要自动修剪(EF)。
幸运的是,EF 6.1 提供了使用拦截器的解决方案。正如 Microsoft 实体框架项目经理 Rowan Miller 所解释的,拦截器可用于自动修剪模型中字符串属性中的尾随空格。
要实现此解决方案,请按照以下步骤操作:
// Omitted for brevity (see full code provided below)
// Omitted for brevity (see full code provided below)
通过将此拦截器和配置类添加到您的项目中,EF 将自动修剪从 char(N) 字段检索的字符串值。修剪将在数据库中进行,以确保最佳性能。
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 { 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 { private static readonly string[] _typesToTrim = { "nvarchar", "varchar", "char", "nchar" }; 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); } } } } using System.Data.Entity; namespace FixedLengthDemo { public class MyConfiguration : DbConfiguration { public MyConfiguration() { AddInterceptor(new StringTrimmerInterceptor()); } } }
以上是如何使用拦截器自动修剪实体框架中的 Char(N) 值?的详细内容。更多信息请关注PHP中文网其他相关文章!