TEMEL
Entity Type Configuration — Tablo / Şema
Entity'nin hangi tabloya, hangi schema'ya map edileceğini belirler. Varsayılan olarak EF Core, DbSet adını tablo adı olarak kullanır. Farklı bir tablo adı, schema veya view'a yönlendirmek istediğinde bu ayarları kullanırsın.
Veritabanı sağlayıcısı
Bu sayfadaki eşleşen örnekleri seçilen sağlayıcıya göre gösterir.
Fluent API
// Tablo adı belirleme
builder.ToTable("Products");
builder.ToTable("Products", schema: "catalog");
// View'a mapping (salt okunur)
builder.ToView("ProductsView");
builder.ToView("ProductsView", schema: "catalog");
// SQL Server: Memory-Optimized Table
builder.ToTable("Products", t => t.IsMemoryOptimized());
// Tabloya yorum ekleme
builder.ToTable("Products", t => t.HasComment("Ürün kataloğu tablosu"));
// Discriminator (TPH için — bkz. bölüm 16)
builder.HasDiscriminator<string>("Type")
.HasValue<Product>("product")
.HasValue<DigitalProduct>("digital");
SQL çıktıları:
-- Schema oluşturma
CREATE SCHEMA [catalog];
GO
-- Tablo oluşturma (schema ile)
CREATE TABLE [catalog].[Products] (
-- ... sütunlar
) ;
GO
-- Tabloya yorum ekleme
EXEC sp_addextendedproperty
@name = N'MS_Description',
@value = N'Ürün kataloğu tablosu',
@level0type = N'SCHEMA', @level0name = 'catalog',
@level1type = N'TABLE', @level1name = 'Products';
CREATE SCHEMA catalog;
CREATE TABLE catalog.products (
-- snake_case sütunlar...
);
COMMENT ON TABLE catalog.products IS 'Ürün kataloğu tablosu';
PostgreSQL Case-Sensitivity Tuzağı: PostgreSQL'de tırnak (
"") olmadan yazılan her identifier otomatik lowercase'e dönüştürülür. EF Core varsayılanda C# isimleriyle (PascalCase) tablo oluşturur → her sorguda""zorunlu olur:-- EF varsayılan (NamingConvention OLMADAN): CREATE TABLE "Products" ("Id" INT, "OrderDate" TIMESTAMPTZ); SELECT * FROM Products; -- ❌ HATA! PG bunu "products" olarak arar, bulamaz SELECT * FROM "Products"; -- ✅ Çalışır ama her yerde "" yazmak zorunda kalırsın -- snake_case convention İLE: CREATE TABLE products (id INT, order_date TIMESTAMPTZ); SELECT * FROM products; -- ✅ Doğrudan çalışır, "" gerekmez! SELECT id, order_date FROM products WHERE id = 1; -- ✅ Temiz, okunabilirKural: PostgreSQL projelerinde her zaman
UseSnakeCaseNamingConvention()kullan. Aksi halde psql, pgAdmin, Dbeaver veya raw SQL'de sürekli""yazmak zorunda kalırsın.
// PostgreSQL snake_case convention (NuGet: EFCore.NamingConventions)
options.UseNpgsql(connectionString)
.UseSnakeCaseNamingConvention(); // Products → products, CreatedAt → created_at
// ⚠️ Bu paketi projenin BAŞINDA ekle! Mevcut migration'larla sonradan eklemek
// tüm tablo/sütun adlarını değiştirir → büyük migration oluşur.
// NuGet: dotnet add package EFCore.NamingConventions
// Schema belirtme (PostgreSQL)
builder.ToTable("products", schema: "catalog");