ایجاد نام جداول به صورت جمع (Pluralized) و داینامیک :
برای اینکه نام جداول به صورت خودکار به صورت جمع ایجاد شوند میتوان از این متد استفاده کرد:
نحوه فراخوانی در متد OnModelCreating:
هر موجودیتی که اتریبیوت Table داشته باشد از همان نام برای جدول استفاده میشود در غیر اینصورت نام انتیتی به صورت جمع ایجاد میگردد.
هر کلاسی در لایه موجودیتها از BaseEntity ارث بری کرده باشد به عنوان یک Entity شناخته میشود.
اگه از روش خودکار کردن تعاریف DbSet ها استفاده کرده باشیم چون دیگر در داخل کلاس Context برنامه، Dbset تعریف نمیشود معمولا برای نام گذاری جداول که به صورت جمع باشند از اتریبیوت Table استفاده میکنیم.
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; [Table("Users")] public class User : BaseEntity { public long Id { get; set; } [Required] public string FullName { get; set; } = null!; }
using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations.Schema; using System.Reflection; namespace ProjectName.Common.EfHelpers; public static class EfToolkit { /// <summary> /// ایجاد نام موجودیتها /// نام موجودیت اگر اتریبیوت تیبل داشته باشد /// از همان نام استفاده میشود و اگر نداشته باشد /// نامش جمع بسته میشود /// </summary> /// <param name="builder"></param> public static void MakeTableNamesPluralized(this ModelBuilder builder) { var entityTypes = builder.Model.GetEntityTypes(); foreach (var entityType in entityTypes) { // Get the CLR type of the entity var entityClrType = entityType.ClrType; var hasTableAttribute = entityClrType.GetCustomAttribute<TableAttribute>(); // Apply the pluralized table name for the entity if (hasTableAttribute is null) { // Get the pluralized table name var pluralizedTableName = GetPluralizedTableName(entityClrType); builder.Entity(entityClrType).ToTable(pluralizedTableName); } } } /// <summary> /// گرفتن نام تایپ و عوض کردن نام آن از مفرد به جمع /// Singular to plural /// Category => Categories /// Box => Boxes /// Bus => Buses /// Computer => Computers /// </summary> /// <param name="entityClrType"></param> /// <returns></returns> private static string GetPluralizedTableName(Type entityClrType) { // Example implementation (Note: This is a simple pluralization logic and might not cover all cases) var typeName = entityClrType.Name; if (typeName.EndsWith("y")) { // Substring(0, typeName.Length - 1) // Range indexer var typeNameWithoutY = typeName[..^1]; return typeNameWithoutY + "ies"; } if (typeName.EndsWith("s") || typeName.EndsWith("x")) { return typeName + "es"; } return typeName + "s"; } }
protected override void OnModelCreating(ModelBuilder builder) { // it should be placed here, otherwise it will rewrite the following settings! base.OnModelCreating(builder); builder.RegisterAllEntities(typeof(BaseEntity)); builder.MakeTableNamesPluralized(); builder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly); }
قبل از اینکه نام جداول نیز جمع بسته شود تمامی موجودیتها به صورت خودکار اضافه میشوند.
public static class EfToolkit { /// <summary> /// ثبت تمامی انتیتیها /// <param name="builder"></param> /// <param name="type"></param> /// </summary> public static void RegisterAllEntities(this ModelBuilder builder, Type type) { var entities = type.Assembly.GetTypes() .Where(x => x.BaseType == type); foreach (var entity in entities) builder.Entity(entity); } }