2012-10-04 8 views
7

Tôi đang sử dụng mã EF đầu tiên trong vấn đề dự án và khuôn mặt của mình khi dữ liệu có id tùy chỉnh được chèn vào.Khung thực thể mã đầu tiên chèn dữ liệu với ID tùy chỉnh

Khi tôi đang cố gắng chèn dữ liệu bằng ID tùy chỉnh (ví dụ 999), EF bỏ qua và chèn ID tăng lên vào bảng.

mô hình của tôi:

public class Address 
{ 
     [Key] 
     public int Id { get; set; } 
     public string FirstName { get; set; } 
... 
} 

Làm thế nào để giải quyết probleb này?

EDIT:

1) Làm thế nào để bắt đầu incrementing từ N, nhưng không phải từ 0?

2) Nếu tôi không chỉ định ID tùy chỉnh, DB phải tăng và chèn riêng. Nếu tôi chỉ định ID tùy chỉnh, DB phải chèn nó. Có thể không?

+0

Bạn có muốn loại bỏ các chức năng autoincrement từ bảng tổng thể? –

+0

Không, tôi không biết. Nếu tôi không chỉ định ID tùy chỉnh, DB phải tăng và chèn riêng. Nếu tôi chỉ định ID tùy chỉnh, DB phải chèn nó. Có thể không? Có thể bắt đầu tăng từ N, nhưng không phải từ 0? –

Trả lời

19

bạn có thể sử dụng thuộc tính sau

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 

trên chìa khóa để lớp hoặc sử dụng fluentAPI

modelBuilder.Entity<Address>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
+1

Cảm ơn câu trả lời. Có thể sử dụng DatabaseGeneratedOption.Identity và chèn ID tùy chỉnh không? –

+0

Không như vậy sẽ chỉ ra cho EF rằng bạn muốn Cơ sở dữ liệu tạo id cho bạn và EF sẽ vô tình bỏ qua bất kỳ giá trị nào bạn đã đặt trên trường đó. – JTMon

+0

Rõ ràng, cảm ơn –

0

Nó thực sự trong OnModelCreating trong lớp DbContext của bạn. Bạn có thể thiết lập một chuỗi không. bắt đầu từ và incrementBy khi bạn hài lòng bằng cách thêm vào sau trong DbContext class Xin vui lòng xem ở đây ví dụ: https://ef.readthedocs.io/en/staging/modeling/relational/sequences.html

class MyContext : DbContext 
    { 
     public DbSet<Order> Orders { get; set; } 

     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared") 
       .StartsAt(1000) 
       .IncrementsBy(5); 

      //Once a sequence is introduced, you can use it to generate values for properties in your model. For example, you can use Default Values to insert the next value from the sequence. 
      modelBuilder.Entity<Order>() 
       .Property(o => o.OrderNo) 
       .HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers"); 
     } 
    }