使用實體框架攔截器自動修剪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中文網其他相關文章!