ในรหัสกรอบงานเอนทิตีก่อนวิธีใช้ KeyAttribute ในหลายคอลัมน์


95

ฉันกำลังสร้างแบบจำลอง POCO เพื่อใช้กับรหัสกรอบงานเอนทิตีแรก CTP5 ฉันใช้การตกแต่งเพื่อสร้างแผนที่คุณสมบัติให้กับคอลัมน์ PK แต่ฉันจะกำหนด PK ในคอลัมน์มากกว่าหนึ่งคอลัมน์ได้อย่างไรและโดยเฉพาะอย่างยิ่งฉันจะควบคุมลำดับของคอลัมน์ในดัชนีได้อย่างไร เป็นผลมาจากลำดับคุณสมบัติในคลาสหรือไม่?

ขอบคุณ!

คำตอบ:


155

คุณสามารถระบุลำดับคอลัมน์ในแอตทริบิวต์เช่น:

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

    [Key, Column(Order=1)]
    public int MySecondKeyProperty { get; set; }

    [Key, Column(Order=2)]
    public string MyThirdKeyProperty { get; set; }

    // other properties
}

หากคุณใช้FindวิธีการของDbSetคุณต้องคำนึงถึงคำสั่งนี้สำหรับพารามิเตอร์หลัก


1
InvalidOperationException: เอนทิตีประเภท 'XXX' มีคีย์หลักแบบผสมที่กำหนดด้วยคำอธิบายประกอบข้อมูล ในการตั้งค่าคีย์หลักแบบผสมให้ใช้ Fluent API
Luca Ziegler

58

ในการกรอกคำตอบที่ถูกต้องที่ Slauma ส่งมาคุณสามารถใช้เมธอดHasKeyเพื่อระบุลำดับสำหรับคีย์หลักแบบผสมได้เช่นกัน:

public class User
{        
    public int UserId { get; set; }       
    public string Username { get; set; }        
}        

public class Ctp5Context : DbContext
{
    public DbSet<User> Users { get; set; }        

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasKey(u => new 
        { 
            u.UserId, 
            u.Username 
        });
    }
}

2
ขอบคุณ - ทั้งสองวิธีทำงานได้ดี ฉันชอบแอตทริบิวต์มากกว่าเพราะฉันสร้างคลาสจากโค้ดและแอตทริบิวต์นั้นกระชับกว่ามาก
GilShalit

ฉันเองยังเพิ่ม Propety (x ... ) HasColumnOrder (0 ... n) ให้กับคุณสมบัติแต่ละคีย์ ที่ดีเลวเฉยเมย?
Suamere

8

ถ้าเช่นฉันคุณต้องการใช้ไฟล์กำหนดค่าคุณสามารถทำได้ด้วยวิธีนี้ (ตามตัวอย่างของ Manavi):

public class User
{
    public int UserId { get; set; }
    public string Username { get; set; }
}  

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        ToTable("Users");
        HasKey(x => new {x.UserId, x.Username});
    }
}

เห็นได้ชัดว่าคุณต้องเพิ่มไฟล์กำหนดค่าในบริบทของคุณ:

public class Ctp5Context : DbContext
{
    public DbSet<User> Users { get; set; }        

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
         modelBuilder.Configurations.Add(new UserConfiguration());
    }
}

0

ใช้เป็นวัตถุที่ไม่ระบุชื่อ:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.