คีย์คอมโพสิตพร้อมรหัส EF 4.1 ก่อน


105

ฉันกำลังพยายามหาวิธีการมีคีย์ผสมโดยใช้รหัส EF First 4.1 RC

ขณะนี้ฉันใช้คำอธิบายประกอบข้อมูล [คีย์] แต่ฉันไม่สามารถระบุได้มากกว่าหนึ่งคีย์

จะระบุคีย์ผสมได้อย่างไร

นี่คือตัวอย่างของฉัน:

 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; }

}

ฉันต้องการ "ชื่อกิจกรรม" เพื่อเป็นกุญแจด้วย แน่นอนว่าฉันสามารถเขียนโค้ดได้ แต่นั่นไม่ใช่การออกแบบฐานข้อมูลที่ดี

คำตอบ:


186

คุณสามารถทำเครื่องหมายActivityIDและActivityNameคุณสมบัติด้วยKeyคำอธิบายประกอบหรือคุณสามารถใช้ Fluent API ตามที่อธิบายโดย @taylonr

แก้ไข:

สิ่งนี้ควรใช้งานได้ - คีย์ผสมที่กำหนดด้วยคำอธิบายประกอบต้องมีลำดับคอลัมน์ที่ชัดเจน:

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; }

}

ฉันเห็น. ขอบคุณสำหรับการอัปเดตฉัน ทำเครื่องหมายว่าเป็นคำตอบ
bugnuker

1
อย่างไรก็ตามเพื่อเพิ่มข้อ จำกัด / ดัชนีเฉพาะที่ไม่ใช่กุญแจจริง ๆ ?
Shimmy Weitzhandler

105

เราไม่ได้ใช้คำอธิบายประกอบ แต่เราจะแทนที่ตัวสร้างโมเดลซึ่งในกรณีนี้คุณสามารถทำสิ่งต่างๆเช่น:

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

วิธีนี้ใช้งานได้ แต่ฉันหวังว่าจะมีคำอธิบายประกอบที่ใช้งานได้ มีตัวอย่างที่มี CTP 4 แต่ใช้ไม่ได้ใน 4.1 RC อีกต่อไป
bugnuker

3
ฉันรู้ว่าคุณกำลังมองหาคำอธิบายประกอบ แต่คิดว่านี่อาจช่วยในการค้นหา ... อย่างที่บอกว่าเราไม่ได้ใช้คำอธิบายประกอบดังนั้นฉันจึงไม่ได้ช่วยอะไรมาก ... หวังว่าคุณจะพบคำตอบ
taylonr

14
ฉันชอบแนวทางนี้ ทำให้โมเดลสะอาดหมดจดสำหรับข้อกังวลด้านบริบท ขอบคุณ.
ctorx

มีใครทราบบ้างว่าการตั้งค่าคีย์หลักแบบผสมโดยใช้ fluent api ใช้ได้กับ SQL CE หรือไม่ มันไม่ได้ผลสำหรับฉัน (ให้ข้อผิดพลาดว่า 'EntityType ... ไม่มีการกำหนดคีย์') และฉันไม่แน่ใจว่าจะสร้างคำถามใหม่หรือไม่
kasitan

หากคุณล้อเลียน DbContext เพื่อวัตถุประสงค์ในการทดสอบหน่วยคุณจะแน่ใจได้อย่างไรว่า modelBuilder ถูกเรียกใช้งานเพื่อกำหนดความสัมพันธ์ระหว่างเอนทิตีและ / หรือคีย์หลักแบบผสม
Jim Aho
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.