Anahtarlar

Anahtar, her varlık örneği için benzersiz bir tanımlayıcı görevi görür. EF'deki çoğu varlığın tek bir anahtarı vardır ve bu anahtar ilişkisel veritabanlarındaki birincil anahtar kavramıyla eşler (anahtarsız varlıklar için bkz. Anahtarsız varlıklar). Varlıklar birincil anahtarın ötesinde ek anahtarlara sahip olabilir (daha fazla bilgi için bkz . Alternatif Anahtarlar ).

Birincil anahtarı yapılandırma

Kural gereği, veya <type name>Id adlı Id bir özellik bir 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; }
}

Dekont

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. Kurallar yalnızca sahip olunan tür koleksiyonu için olduğu gibi belirli durumlarda bileşik anahtar ayarlar.

Dekont

[PrimaryKey] özniteliği EF Core 7.0'da tanıtıldı. Fluent API'sini eski sürümlerde kullanın.

[PrimaryKey(nameof(State), nameof(LicensePlate))]
internal class Car
{
    public string State { get; set; }
    public string LicensePlate { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

Değer oluşturma

Bileşik olmayan sayısal anahtarlar ve GUID birincil anahtarları için EF Core sizin için değer oluşturmayı kurala göre ayarlar. Örneğin, SQL Server'daki sayısal birincil anahtar otomatik olarak bir IDENTITY sütunu olacak şekilde ayarlanır. Daha fazla bilgi için değer oluşturma belgelerine ve belirli devralma eşleme stratejilerine yönelik yönergelere 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ının 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ğerleri

EF Core, , Guidbyte[] ve diğerleri dahil olmak üzere stringbirincil anahtar olarak herhangi bir ilkel türün özelliklerini kullanmayı desteklese de, tüm veritabanları tüm türleri anahtar olarak 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 bir varlık eklerken anahtar özelliklerin her zaman varsayılan olmayan bir değere sahip olması gerekir, ancak veritabanı tarafından bazı türler oluşturulur. Bu durumda EF, varlık izleme amacıyla eklendiğinde geçici bir değer oluşturmaya çalışır. SaveChanges çağrıldıktan sonra geçici değer veritabanı tarafından oluşturulan değerle değiştirilir.

Önemli

Bir anahtar özelliğin değeri veritabanı tarafından oluşturulduysa ve bir varlık eklendiğinde varsayılan olmayan bir değer belirtilirse, EF varlığın veritabanında zaten var olduğunu varsayar ve yeni bir varlık eklemek yerine güncelleştirmeyi dener. Bunu önlemek için değer oluşturmayı kapatın veya oluşturulan özellikler için açık değerlerin nasıl belirtileceğini görün.

Alternatif Anahtarlar

Alternatif anahtar, birincil anahtara ek olarak her varlık örneği için alternatif bir benzersiz tanımlayıcı görevi görür; bir ilişkinin hedefi olarak kullanılabilir. İlişkisel veritabanı kullanırken bu, alternatif anahtar sütunlarında benzersiz bir dizin/kısıtlama ve sütunlara başvuran bir veya daha fazla yabancı anahtar kısıtlaması kavramına eşler.

Bahşiş

Yalnızca bir sütunda benzersizliği zorlamak istiyorsanız, alternatif anahtar yerine benzersiz bir dizin tanımlayın (bkz . Dizinler). EF'de alternatif anahtarlar salt okunur olur ve yabancı anahtarın hedefi olarak kullanılabildikleri için benzersiz dizinler üzerinde ek semantikler sağlar.

Alternatif anahtarlar genellikle gerektiğinde sizin için tanıtılır ve bunları el ile yapılandırmanız gerekmez. Kural gereği, bir ilişkinin hedefi olarak birincil anahtar olmayan bir özelliği tanımladığınızda sizin için alternatif bir anahtar tanıtılır.

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) olarak da yapılandırabilirsiniz:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => new { c.State, c.LicensePlate });
}

Son olarak, kurala göre, alternatif anahtar için sunulan dizin ve kısıtlama adlandırılır AK_<type name>_<property name> (bileşik alternatif anahtarlar <property name> için özellik adlarının alt çizgiyle ayrılmış bir listesi haline gelir). Alternatif anahtarın dizininin adını ve benzersiz kısıtlamasını yapılandırabilirsiniz:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => c.LicensePlate)
        .HasName("AlternateKey_LicensePlate");
}