برای اینکه موقع پر کردن فیلدهای متنی دیتابیس مون ، در سی شارپ هر بار متد Trim رو بعد از فیلدهای متنی ننویسیم میتونیم این کار رو یکجا برای orm محبوبمون یعنی ef core تعریف کنیم تا زحمتشو برامون بکشه.
شما می تونید با override کردن متد SaveChangesAsync کلاس DbContext به این امر دست یابید. در متد اورراید شده میتوانید روی موجودیتهای در ChangeTracker حرکت کنید و قبل از ذخیره تغییرات در دیتابیس ، تمام پراپرتی های رشته ای را تریم کنید.
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
TrimStringProperties();
return await base.SaveChangesAsync(cancellationToken);
}
private void TrimStringProperties()
{
var entries = ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added || e.State == EntityState.Modified);
foreach (var entry in entries)
{
foreach (var property in entry.Properties)
{
if (property.CurrentValue is string stringValue)
{
property.CurrentValue = stringValue.Trim();
}
}
}
}
اگر code first کار میکنید که همین کافیه.
اگر db first کار میکنید و از روی دیتابیس scaffold انجام میدین و کلاس AppDbContext و کلاسهای انتیتی رو میسازید ، برای اینکه بعد از اسکفولد این کد یعنی متد اورراید SaveChangesAsync رو هر بار دستی به AppDbContext که دیلیت میشه و دوباره ساخته میشه اضافه نکنید میتونید یه کلاس partial اضافه کنید و در اون فایل این متد رو بزارید و دیگه این فایل در عملیات اسکفولد دیلیت نمیشه.
برای اینکار یه کلاس به نام AppDbContextPartial کنار AppDbContext در فولدر Data که خروجی اسکفولد در اون قرار میگیره اضافه کنید. ابتدا مثل هر کلاس دیگه نام فایل و کلاس جدید مثل هم هستند (AppDbContextPartial). به اسم فایل دست نزنید چون نمیتونید در یک فولدر 2 فایل هم نام داشته باشید. بعد از ایجاد وارد فایل شده و اسم کلاس که AppDbContextPartial هست رو به کلاس اصلی دی بی کانتکس تون تغییر بدین که در این مثال AppDbContext هست. حالا هر دو کلاس AppDbContext که در دو فایل AppDbContextPartial و AppDbContext هستن رو پارشیال کنید (با اضافه کردن کلمه کلیدی partial قبل از کلمه کلیدی class)
حالا این دو فایل موقع بیلد پروژه به یک کلاس تبدیل میشن ولی شما دیگه نگران حذف و ساخت مجدد فایل AppDbContext بعد از اسکفولد نیستین.
من فایلهای تولیدی کامند اسکفولد ef core رو در فولدر Data میریزیم ، کلاسهای انتیتی در فولدر Models و کلاس AppDbContext رو در فولدر Data که میشه این کامند :
dotnet ef dbcontext scaffold "Server=.\SQLExpress2022;Database=MyDb;Trusted_Connection=True;TrustServerCertificate=True" Microsoft.EntityFrameworkCore.SqlServer --no-onconfiguring -o Data/Models --context-dir Data -c AppDbContext -f
آپشن o- یعنی output که میشه مسیر خروجی کلاسهای انتیتی
آپشن context-dir-- یعنی مسیر خروجی کلاس دی بی کانتکس
آپشن c- یعنی اسم class دی بی کانتکس چی باشه
آپشن f- یعنی به صورت force فایل های جدید رو بساز و اگر از قبل فایلی با این نام موجود بود حذف کن و دوباره فایل جدید رو بساز
آپشن no-onconfiguring-- هم باعث میشه کانکشن استرینگ رو در فایل AppDbContext ننویسه و موقع اینجکت DbContext در فایل program.cs کانکشن استرینگ رو براش ارسال میکنیم.
اگه کدها اینجا خوب قابل خوندن نیست کدها رو در استک اور فلو هم گذاشتم :