Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memangkas Nilai Char(N) secara Automatik dalam Rangka Kerja Entiti Menggunakan Pemintas?

Bagaimana untuk Memangkas Nilai Char(N) secara Automatik dalam Rangka Kerja Entiti Menggunakan Pemintas?

Barbara Streisand
Barbara Streisandasal
2024-12-29 13:32:10332semak imbas

How to Automatically Trim Char(N) Values in Entity Framework Using Interceptors?

Memangkas Nilai Char(N) Secara Automatik dengan Pemintas Rangka Kerja Entiti

Dalam senario ini, anda menghadapi cabaran apabila nilai teks disimpan sebagai medan char(N) dalam pangkalan data luaran perlu dipangkas secara automatik apabila diambil dalam Rangka Kerja Entiti (EF).

Nasib baik, EF 6.1 menyediakan penyelesaian menggunakan Pemintas. Seperti yang dijelaskan oleh Rowan Miller, pengurus program untuk Rangka Kerja Entiti di Microsoft, Pemintas boleh digunakan untuk memangkas ruang putih mengekori secara automatik daripada sifat rentetan dalam model anda.

Untuk melaksanakan penyelesaian ini, ikut langkah berikut:

  1. Tentukan kelas StringTrimmerInterceptor sebagai berikut:
// Omitted for brevity (see full code provided below)
  1. Buat kelas MyConfiguration untuk mendaftarkan pemintas dengan EF:
// Omitted for brevity (see full code provided below)

Dengan menambahkan pemintas dan kelas konfigurasi ini pada projek anda , EF secara automatik akan memangkas nilai rentetan yang diambil daripada medan char(N). Pemangkasan akan berlaku dalam pangkalan data, memastikan prestasi optimum.

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());
        }
    }
}

Atas ialah kandungan terperinci Bagaimana untuk Memangkas Nilai Char(N) secara Automatik dalam Rangka Kerja Entiti Menggunakan Pemintas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn