Anahtarlar
Anahtar, her varlık örneği için benzersiz bir tanımlayıcı olarak görev eder. EF'de çoğu varlık, ilişkisel veritabanlarında birincil anahtar kavramıyla eşlemektedir (anahtarsız varlıklar için bkz. Anahtarsız varlıklar). Varlıkların birincil anahtarın ötesinde ek anahtarları olabilir (daha fazla bilgi için bkz. Alternatif Anahtarlar).
Birincil anahtarı yapılandırma
Kural gereği, veya adlı Id<type name>Id bir özellik varlığın birincil anahtarı olarak yapılandırılır.
internal class Car
{
public string Id { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}
internal class Truck
{
public string TruckId { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}
Not
Sahip olunan varlık türleri anahtarları tanımlamak için farklı kurallar kullanır.
Tek bir özelliği, bir varlığın birincil anahtarı olacak şekilde aşağıdaki gibi yapılandırabilirsiniz:
internal class Car
{
[Key]
public string LicensePlate { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}
Birden çok özelliği bir varlığın anahtarı olacak şekilde de yapılandırabilirsiniz. Bu, bileşik anahtar olarak bilinir. Bileşik anahtarlar yalnızca Fluent API'si kullanılarak yalıtabilirsiniz; kural hiçbir zaman bileşik anahtar ayarlamaz ve bir tane yapılandırmak için Veri Ek Açıklamalarını kullanamazsanız.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasKey(c => new { c.State, c.LicensePlate });
}
Değer oluşturma
Bileşik olmayan sayısal ve GUID birincil anahtarları için EF Core sizin için değer oluşturma kuralına göre ayarlar. Örneğin, veri kümesinde sayısal SQL Server anahtar otomatik olarak IDENTITY sütunu olacak şekilde ayarlanır. Daha fazla bilgi için değer oluşturma belgelerine bakın.
Birincil anahtar adı
Kural gereği, ilişkisel veritabanlarında birincil anahtarlar adıyla PK_<type name> oluşturulur. Birincil anahtar kısıtlaması adını aşağıdaki gibi yapılandırabilirsiniz:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasKey(b => b.BlogId)
.HasName("PrimaryKey_BlogId");
}
Anahtar türleri ve değerler
Bu EF Core , ve diğerleri de dahil olmak üzere birincil anahtar olarak herhangi bir temel türün özelliklerini kullanmayı destekler, ancak tüm veritabanları tüm türleri stringGuid anahtar olarak byte[] desteklemez. Bazı durumlarda anahtar değerleri otomatik olarak desteklenen bir türe dönüştürülebilir, aksi takdirde dönüştürme el ile belirtilmelidir.
Bağlama yeni varlık eklerken anahtar özellikleri her zaman varsayılan olmayan bir değere sahip olmalıdır, ancak bazı türler veritabanı tarafından oluşturulur. Bu durumda EF, izleme amacıyla varlık ekleniyorken geçici bir değer üretmeyi dener. SaveChanges çağrıldıktan sonra geçici değer veritabanı tarafından oluşturulan değerle değiştirilir.
Önemli
Bir anahtar özelliği veritabanı tarafından oluşturulan değerine sahipse ve bir varlık ekleniyorsa varsayılan olmayan bir değer belirtilirse EF, varlığın veritabanında zaten mevcut olduğunu varsayacak ve yenisini eklemek yerine bunu güncelleştirmeye çalışacak. Bunu önlemek için değer oluşturmayı kapatın veya oluşturulan özellikler için açık değerleri belirtmeye bakın.
Alternatif Anahtarlar
Alternatif anahtar, birincil anahtara ek olarak her varlık örneği için alternatif bir benzersiz tanımlayıcı olarak görev eder; bir ilişkinin hedefi olarak kullanılabilir. İlişkisel veritabanı kullanırken bu, alternatif anahtar sütunlarda benzersiz dizin/kısıtlama kavramıyla ve sütunlara başvurulan bir veya daha fazla yabancı anahtar kısıtlaması ile eşler.
İpucu
Yalnızca bir sütunda benzersizliği zorlamak için alternatif anahtar yerine benzersiz bir dizin tanımlayın (bkz. Dizinler). EF'de alternatif anahtarlar salt okunur olur ve benzersiz dizinler üzerinde ek semantik sağlar çünkü bunlar yabancı anahtarın hedefi olarak kullanılabilir.
Alternatif anahtarlar genellikle gerektiğinde sizin için tanıtıldığında ve bunları el ile yapılandırmanız gerekmez. Kural gereği, bir ilişkinin hedefi olarak birincil anahtar olmayan bir özelliği tanımsanız size alternatif bir anahtar tanıtıldı.
internal class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.HasOne(p => p.Blog)
.WithMany(b => b.Posts)
.HasForeignKey(p => p.BlogUrl)
.HasPrincipalKey(b => b.Url);
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public string BlogUrl { get; set; }
public Blog Blog { get; set; }
}
Tek bir özelliği alternatif anahtar olacak şekilde de yapılandırabilirsiniz:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasAlternateKey(c => c.LicensePlate);
}
Birden çok özelliği alternatif anahtar (bileşik alternatif anahtar olarak bilinir) olacak şekilde de yapılandırabilirsiniz:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasAlternateKey(c => new { c.State, c.LicensePlate });
}
Son olarak, kural gereği, alternatif bir anahtar için ortaya konan dizin ve kısıtlama adı olur (bileşik alternatif anahtarlar için özellik adlarının alt AK_<type name>_<property name><property name> çizgiyle ayrılmış bir listesi olur). Alternatif anahtarın dizinini ve benzersiz kısıtlamasını yapılandırarak:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasAlternateKey(c => c.LicensePlate)
.HasName("AlternateKey_LicensePlate");
}