EF 4.1 Code First ile Bileşik Anahtar


105

EF code First 4.1 RC kullanarak birleşik bir anahtara nasıl sahip olunacağını anlamaya çalışıyorum.

Şu anda, [Anahtar] Veri Ek Açıklamasını kullanıyorum, ancak birden fazla anahtar belirleyemiyorum.

bileşik anahtar nasıl belirlenir?

İşte Örneğim:

 public class ActivityType
{
    [Key]
    public int ActivityID { get; set; }

    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

"EtkinlikAdı" nın da bir anahtar olmasına ihtiyacım var. Elbette, bunun etrafında kod yazabilirim, ancak bu iyi bir veritabanı tasarımı değil.

Yanıtlar:


186

Her iki işaretleyebilirsiniz ActivityIDve ActivityNamebirlikte özelliklerini Keyaçıklama ya @taylonr tarafından açıklandığı gibi akıcı API kullanabilirsiniz.

Düzenle:

Bu çalışmalıdır - ek açıklamalarla tanımlanan bileşik anahtar, açık sütun sırası gerektirir:

public class ActivityType
{
    [Key, Column(Order = 0)]
    public int ActivityID { get; set; }

    [Key, Column(Order = 1)]
    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

Anlıyorum. Beni güncellediğiniz için teşekkürler. Cevap olarak işaretlendi.
bugnuker

1
Her neyse, gerçekten anahtar olmayan benzersiz kısıtlamalar / dizinler eklemek için?
Shimmy Weitzhandler

105

Ek açıklamaları kullanmıyoruz, bunun yerine model oluşturucuyu geçersiz kılıyoruz, bu durumda aşağıdakilere benzer bir şey yapabilirsiniz:

modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName });

bu işe yarıyor, ancak işe yarayan bir ek açıklama umuyorum. CTP 4 ile örnekler vardı ancak bunlar artık 4.1
RC'de

3
Ek açıklamalar aradığınızı biliyorum, ancak bunun aramada yardımcı olabileceğini düşündüm ... Ek açıklamaları kullanmadığımızı söylediğim gibi, bu yüzden orada pek yardımcı olmadım ... Umarım cevabı bulursunuz
taylonr

14
Bu yaklaşımı beğendim. Modeli Bağlam kaygılarından temiz tutar. Teşekkürler.
ctorx

Akıcı API kullanarak bileşik birincil anahtar ayarlamanın SQL CE için çalışıp çalışmadığını bilen var mı? Benim için çalışmıyor ('EntityType ... tanımlı anahtar yok' hatası veriyor) ve yeni bir soru oluşturup oluşturmayacağımdan emin değilim.
kasitan

DbContext'inizi birim testi amacıyla taklit ederseniz, varlıklar ve / veya bileşik birincil anahtarlar arasındaki ilişkiyi tanımlamak için modelBuilder'ın çalıştırıldığından nasıl emin olursunuz?
Jim Aho
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.