"Enter"a basıp içeriğe geçin

Postgresql ve EF Core ile Snake Case İsimlendirme

Postgres üzerinde isimlendirmeler yapılırken genellikle “snake case” olarak yapılıyor. Tablo isimlerinizde büyük-küçük harfler kullanırsanız sorgularınızda tablo ve kolon isimlerini tırnak işaretleri arasında yazmanız gerekiyor. Bu durum karmaşık sorgularda rahatsız edici bir hal alabiliyor.

EF Core ile Snake Case İsimlendirme

Tablo ve sütun isimlerinizi DbContext sınıfında OnModelCreating metodu içinde ayarlayabilirsiniz.

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity().ToTable("blog-post");
    builder.Entity()
        .Property(b => b.Excerpt).HasColumnName("excerpt");
}

Bu durumda tüm tablo ve sütun isimlerini tek tek belirtmeniz gerekiyor.

Diğer bir yol ise, OnModelCreating içinde kendinize göre bir isimlendirme belirtmek. (Örnek Uygulama)

foreach (var entity in builder.Model.GetEntityTypes())
{
    ...
}

Son olarak, EfCore.NamingConventions nuget paketi ile snake-case isimlendirmeleri otomatik olarak gerçekleştirebilirsiniz.

public static IServiceCollection RegisterAppDbContext(this IServiceCollection services,
    IConfiguration configuration)
{
    services.AddDbContext<AppDbContext>(options =>
    {
        options.UseNpgsql(configuration.GetConnectionString("DefaultConnection"))
            .UseSnakeCaseNamingConvention(culture: new CultureInfo("en-US"));
    });
    return services;
}

CultureInfo parametresini belirtmezseniz, Id sütunu “id” değilde “ıd” olarak oluşturuluyor.

Eğer Identity kullanıyorsanız, Identity’e ait tablo isimleri değiştirilmiyor(sütun isimleri snake-case olarak isimlendiriliyor). Bu adreste bu durum tartışılmış ancak bir çözüm getirilmemiş.

builder.Entity<ApplicationUser>().ToTable("asp_net_users");
builder.Entity<IdentityUserToken<string>>().ToTable("asp_net_user_tokens");
builder.Entity<IdentityUserLogin<string>>().ToTable("asp_net_user_logins");
builder.Entity<IdentityUserClaim<string>>().ToTable("asp_net_user_claims");
builder.Entity<IdentityRole>().ToTable("asp_net_roles");
builder.Entity<IdentityUserRole<string>>().ToTable("asp_net_user_roles");
builder.Entity<IdentityRoleClaim<string>>().ToTable("asp_net_role_claims");

Yukarıdaki gibi identity’e ait tablo isimlerini tek tek verebilirisiniz.

İlk Yorum Sizden Gelsin

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir