2011-02-09 20 views
62

Tôi đang tạo mô hình POCO để sử dụng với mã khung thực thể đầu tiên CTP5. Tôi đang sử dụng trang trí để tạo bản đồ thuộc tính cho một cột PK. Nhưng làm thế nào tôi có thể xác định một PK trên nhiều hơn sau đó một cột, và cụ thể, làm thế nào tôi có thể kiểm soát thứ tự của các cột trong chỉ mục? Có phải đó là kết quả của thứ tự các thuộc tính trong lớp không?trong mã khung thực thể đầu tiên, cách sử dụng KeyAttribute trên nhiều cột

Cảm ơn!

Trả lời

109

Bạn có thể chỉ định thứ tự cột trong các thuộc tính, ví dụ:

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 
} 

Nếu bạn đang sử dụng phương pháp Find của một DbSet bạn phải mất trật tự này cho các thông số quan trọng vào tài khoản.

38

Để hoàn thành câu trả lời đúng do Slauma, bạn có thể sử dụng HasKey phương pháp chỉ định thứ tự cho các phím composite tiểu học cũng như:

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

Cảm ơn - cả hai phương pháp này hoạt động tốt. Tôi thích các thuộc tính bởi vì tôi tạo ra các lớp của tôi từ mã, và các thuộc tính ngắn gọn hơn nhiều. – GilShalit

+0

Cá nhân tôi cũng thêm Propety (x ...). HasColumnOrder (0 ... n) vào mỗi thuộc tính được khóa. Điều đó tốt, xấu, không quan tâm? – Suamere

5

Nếu, như tôi, bạn thích sử dụng một cấu hình file bạn có thể làm điều đó theo cách này (dựa trên ví dụ Manavi của):

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

Rõ ràng bạn phải thêm các tập tin cấu hình để hoàn cảnh của bạn:

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

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

Sử dụng như một đối tượng ẩn danh:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username });