Entity Framework での Char(N) 値の自動トリミング
char(N) 列に対して取得された値のトリミングは、次のようなデータベースを操作する場合に不可欠です。テキスト値を固定長形式で保存します。この記事では、これらの値を自動的にトリミングしてアプリケーションの一貫性と効率性を確保するように Entity Framework (EF) を構成する方法について説明します。
EF は、データ エンティティをデータベース列にマッピングするための包括的な API を提供しますが、組み込み機能がありません。自動トリミング機能。これに対処するために、インターセプターを使用するソリューションが提案されています。このアプローチでは、EF のインターセプト メカニズムを活用して、データベース クエリを変更し、トリミング ルールを動的に適用します。
提案されたインターセプター StringTrimmerInterceptor は、クエリ ツリーをインターセプトし、文字列プロパティをトリミングするように変更します。プロパティの EDM タイプをチェックし、指定された文字列タイプ (nvarchar や char など) と一致する場合は、それらを Trim(expression) 呼び出しに置き換えます。これにより、データベースから取得されたすべての文字列プロパティが自動的にトリミングされます。
StringTrimmerInterceptor を使用するには、Entity Framework 構成に登録する必要があります。これは、DbConfiguration またはコードベースの構成を通じて実現できます。 EF コンテキストと同じアセンブリに AddInterceptor メソッドを持つ MyConfiguration クラスを配置すると、インターセプターがアクティブになります。
StringTrimmerInterceptor の実装とそれを登録するコードは、次のスニペットで提供されます:
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()); } } }
StringTrimmerInterceptor を実装し、EF 構成に登録することで、char(N) 列の値を簡単にトリミングできます明示的な LINQ to Entities クエリの変更は必要ありません。このアプローチにより、トリミングされたデータがアプリケーション全体で一貫して返され、メンテナンスが簡素化され、データベースのオーバーヘッドが削減されることでパフォーマンスが向上します。
以上がEntity Framework はどのようにして char(N) 値を自動的にトリミングできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。