trước tiên trong mã khung thực thể, cách sử dụng KeyAttribute trên nhiều cột


93

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

Cảm ơn!

Câu trả lời:


153

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 Findphương pháp của một, DbSetbạn phải tính đến thứ tự này cho các tham số chính.


1
InvalidOperationException: Loại thực thể 'XXX' có khóa chính tổng hợp được xác định với chú thích dữ liệu. Để đặt khóa chính tổng hợp, hãy sử dụng API thông thạo.
Luca Ziegler

55

Để hoàn thành câu trả lời chính xác do Slauma gửi, bạn có thể sử dụng phương pháp HasKey để chỉ định thứ tự cho các khóa chính tổng hợp:

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 đều hoạt động tốt. Tôi thích Thuộc tính hơn vì tôi đang tạo các lớp của mình từ mã và các thuộc tính ngắn gọn hơn nhiều.
GilShalit

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. Đó là tốt, xấu, thờ ơ?
Suamere

7

Nếu, giống như tôi, bạn thích sử dụng tệp cấu hình, bạn có thể làm điều đó theo cách này (dựa trên ví dụ của 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});
    }
}

Rõ ràng là bạn phải thêm tệp cấu hình vào ngữ cảnh của mình:

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 }); 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.