2014-04-18 17 views
10

olmalıdır, otomatik olarak artmıyor, bir kimlik tutan ortak bir temel sınıftan türetmem gereken birkaç sınıfa sahibim.EF6 CodeFirst My [Key] Id Sütun, bir kimlik sütunu

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

Bağlam (DataContext) şöyle görünür: I-Migrations etkinleştirme zaman

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

çıkan DB, ekleme, şu an için bunların biri hariç hepsi yok sayılması, o zaman kalan diyelim -Migration İlk ve Güncelleme-Veritabanı hiçbir tablo denilen MyBases olsun, ama bunun yerine MyNames

yılında Kimliği sütunu elde ediyoruz
dbo.MyNames 
    ----------- 
    Id (PK, int, not null) 
    Name (nvarchar(max), null) 

Şimdiye kadar iyi, bütün bunlar derler ve kurar, sonra test kullanma Aşağıdaki gibi bir şey:

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

Bu ilk kez çalışır (Janice Id = 0 ile eklenir) ancak değil ikinci ... Jimmy YİNELENEN KEY istisna alır. Not (tam açıklama için) aslında kodumun başka bir parçasındaki jj ve jh nesnelerini oluşturuyorum, sonra bunları MyBase nesnesi olarak bu yönteme (yukarıda) aktarıyorum, sonra da onları oldukları gibi MyName nesnelerine geri gönderiyorum. Umarım bu bir problem değildir.

Sanırım her şey bir tablodaysa Kimlik Kimlik olarak işaretlenebilir ve nesne kimliği değerini atamak için @@ IDENTITY kullanılabilir. Belki de sonuçta bir MyBases tablosu oluşturmam gerekecek ve önce bu kaydı oluşturacak, daha sonra Id işlemini bir işlemdeki türetilmiş tablolara kopyalayacağım. Bunun için en iyi yaklaşım nedir?

Bu EF6 CodeFirst acemi için herhangi bir yardım mutluluk duyacaktır. TEŞEKKÜRLER.

+0

Oluşturulan şema/DDL'yi kaydeder misiniz? –

cevap

20

Ben EF yapmak için kullanılan zaman Kimlik içeren bir tablo yaratacak ve sınıfta ben bu yüzden kodunuzu olması gerektiğini varsayıyorum

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

ile id özelliği sütunu olur hatırlıyorum

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

Bu, MyBases tablosunun oluşturulmasına neden olan istenen etkiye sahipti. –

+0

Şimdi ne kullanıyorsunuz? –

+1

garip bir şekilde bunu ONE model sınıfı için yapmak zorunda kaldım, ama diğerleri değil. Senden nefret ediyorum EntityFramework. –

0

Sorunun EF6 Kod İlk Geçişlerini kullandığınız gerçeğinde olduğuna inanıyorum. Bunu yaparken, DB'nizi .AddOrUpdate() yöntemini kullanarak tohumlamanız gerekir. This Stack Overflow Question bunu kapsamaktadır.

İlgili konular