Rumah > pangkalan data > tutorial mysql > Bagaimanakah Rangka Kerja Entiti Boleh Memangkas Nilai char(N) Secara Automatik?

Bagaimanakah Rangka Kerja Entiti Boleh Memangkas Nilai char(N) Secara Automatik?

Barbara Streisand
Lepaskan: 2024-12-25 17:33:14
asal
247 orang telah melayarinya

How Can Entity Framework Automatically Trim char(N) Values?

Memangkas Nilai Char(N) Secara Automatik dalam Rangka Kerja Entiti

Nilai pemangkasan yang diambil untuk lajur char(N) adalah penting apabila bekerja dengan pangkalan data yang menyimpan nilai teks dalam format panjang tetap. Artikel ini meneroka cara mengkonfigurasi Rangka Kerja Entiti (EF) untuk memangkas nilai ini secara automatik, memastikan ketekalan dan kecekapan dalam aplikasi anda.

EF menyediakan API komprehensif untuk memetakan entiti data ke lajur pangkalan data, tetapi ia tidak mempunyai terbina dalam fungsi untuk pemangkasan automatik. Untuk menangani ini, penyelesaian menggunakan Interceptors telah dicadangkan. Pendekatan ini memanfaatkan mekanisme pemintasan EF untuk mengubah suai pertanyaan pangkalan data dan menggunakan peraturan pemangkasan secara dinamik.

Pemintas yang dicadangkan, StringTrimmerInterceptor, memintas pepohon pertanyaan dan mengubah suainya untuk memangkas sifat rentetan. Ia menyemak jenis sifat EDM dan, jika dipadankan dengan jenis rentetan tertentu (seperti nvarchar atau char), menggantikannya dengan panggilan Trim(ungkapan). Ini memastikan bahawa semua sifat rentetan yang diambil daripada pangkalan data dipangkas secara automatik.

Untuk menggunakan StringTrimmerInterceptor, ia perlu didaftarkan dengan konfigurasi Rangka Kerja Entiti. Ini boleh dicapai melalui DbConfiguration atau Konfigurasi Berasaskan Kod. Meletakkan kelas MyConfiguration dengan kaedah AddInterceptor dalam pemasangan yang sama dengan konteks EF akan mengaktifkan pemintas.

Pelaksanaan StringTrimmerInterceptor dan kod untuk mendaftarkannya disediakan dalam coretan berikut:

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());
        }
    }
}
Salin selepas log masuk

Dengan melaksanakan StringTrimmerInterceptor dan mendaftarkannya dengan konfigurasi EF, anda boleh memangkas nilai lajur char(N) dengan mudah tanpa memerlukan pengubahsuaian pertanyaan LINQ kepada Entiti yang jelas. Pendekatan ini memastikan data yang dipangkas dikembalikan secara konsisten sepanjang aplikasi anda, memudahkan penyelenggaraan dan meningkatkan prestasi dengan mengurangkan overhed pangkalan data.

Atas ialah kandungan terperinci Bagaimanakah Rangka Kerja Entiti Boleh Memangkas Nilai char(N) Secara Automatik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan