2014-04-18 19 views
10

Tôi có một số lớp mà tôi cần để lấy được từ một lớp cơ sở chung chứa Id. Bỏ qua tất cả nhưng một trong những cho thời điểm này, chúng ta hãy nói rằng chúng ta có:EF6 CodeFirst Cột Id [Key] của tôi không tự động gia tăng dưới dạng cột nhận dạng nên

public class MyBase { 
    [Key] 
    public int Id { get; set; } 
} 
public class MyName : MyBase { 
    public string Name { get; set; } 
} 

bối cảnh của tôi (DataContext) trông như thế này:

public DbSet<MyName>MyNames { get; set; } 

// to avoid having EF make a MyBases table and instead map 
// MyBase.Id into MyNames and my other derived classes I do this ... 

protected override void OnModelCreating((DbModelBuilder modelBuilder) { 
    modelBuilder.Entity<MyBase>() 
      .Property(c => c.Id) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

    modelBuilder.Entity<MyName>() 
      .Map(m => { 
        m.MapInheritedProperties(); 
        m.ToTable("MyNames"); 
       }); 
} 

Kết quả là DB, khi tôi Enable-Migrations, Thêm -Migration ban đầu, và cập nhật cơ sở dữ liệu-là tôi không nhận được bảng gọi MyBases, nhưng thay vào đó tôi nhận được cột Id trong MyNames

dbo.MyNames 
    ----------- 
    Id (PK, int, not null) 
    Name (nvarchar(max), null) 

cho đến nay rất tốt, tất cả điều đó biên dịch và xây dựng, và sau đó tôi thử nghiệm nó sử dụng giống như sau:

using (DataContext dc = new DataContext()) { 
     var jj = new MyName { Name = "Janice Joplin" }; 
     dc.MyNames.Add(jj); 
     dc.SaveChanges(); 

     var jh = new MyName { Name = "Jimmy Hendrix" }; 
     dc.MyNames.Add(jh); 
     dc.SaveChanges(); 
    } 

này hoạt động lần đầu tiên (Janice được thêm vào với Id = 0) nhưng không thứ hai ... Jimmy được một ngoại lệ khóa trùng lặp. Tôi thực sự tạo ra các đối tượng jj và jh trong một phần khác của mã của tôi, sau đó chuyển chúng vào phương thức này (ở trên) như các đối tượng MyBase, sau đó đưa chúng trở lại đối tượng MyName nếu đó là chúng là gì. Tôi hy vọng đó không phải là một vấn đề.

Tôi đoán nếu mọi thứ ở trong một bảng, Id có thể được đánh dấu là Identity và @@ IDENTITY có thể được sử dụng để gán giá trị Id đối tượng. Có lẽ tôi sẽ cần phải thực hiện một bảng MyBases sau khi tất cả, và tạo bản ghi đó đầu tiên, sau đó lặp lại các Id vào các bảng có nguồn gốc trong một giao dịch. Cách tiếp cận tốt nhất cho việc này là gì?

Bất kỳ trợ giúp nào cho người mới này EF6 CodeFirst sẽ được đánh giá cao. CẢM ƠN.

+0

Bạn có thể đăng lược đồ/DDL đã tạo không? –

Trả lời

20

Tôi nhớ khi tôi sử dụng để làm EF tôi sẽ tạo ra một bảng với Identity và trong lớp tôi sẽ gán cột id với

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

vì vậy tôi giả định rằng mã của bạn nên

modelBuilder.Entity<MyBase>() 
     .Property(c => c.Id) 
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
+0

Điều này có tác dụng mong muốn gây ra bảng MyBases được tạo. –

+0

Bây giờ bạn sử dụng cái gì? –

+1

kỳ quặc đủ Tôi đã phải làm điều này cho ONE lớp mô hình nhưng không phải những người khác. Tôi ghét bạn EntityFramework. –

0

Tôi tin rằng vấn đề nằm trong thực tế bạn đang sử dụng EF6 Code First Migrations. Khi bạn đang làm như vậy, bạn cần phải hạt giống DB của bạn bằng cách sử dụng phương thức .AddOrUpdate(). This Stack Overflow Question bao gồm nó.

Các vấn đề liên quan