2014-11-21 51 views
1

我先使用代碼和TPT繼承。正在生成的實體的基本類型表的主鍵上沒有標識。 (如果有幫助,我可以發佈代碼)I.E.我的人員表有一個主鍵,但不是「身份」。子類表按預期方式生成。TPT基類主鍵身份約定

因爲它不是產生於基本類型的主鍵,我試圖添加HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)地圖,這打破了模型,我得到一個錯誤說:

衝突的配置設置是爲屬性指定類型'Orion.Data.Entities.Person'上的'Id':DatabaseGeneratedOption = None與DatabaseGeneratedOption = Identity衝突。

我已經搜索了可能爲該屬性指定'DatabaseGeneratedOption.None'的任何地方,並且它不在我的代碼中。我認爲這是EF6中的配置慣例。我已經嘗試調試到.net,以找到它打破的地方,沒有成功。

所以問題是,什麼約定可能導致我可以禁用?或者還有其他的東西在玩嗎?

編輯: 基本映射:

public abstract partial class Person 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class PersonMap : EntityTypeConfiguration<Person> 
{ 
    public PersonMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.Id); 

     // Properties 
     this.Property(t => t.FirstName) 
      .IsRequired() 
      .HasMaxLength(25); 

     this.Property(t => t.LastName) 
      .IsRequired() 
      .HasMaxLength(25); 

     this.ToTable("People"); 
     this.Property(t => t.Id).HasColumnName("Id"); 
     //this.Property(t=>t.Id).HasColumnName("Id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) 
     this.Property(t => t.FirstName).HasColumnName("FirstName"); 
     this.Property(t => t.LastName).HasColumnName("LastName"); 

     // Relationship 
     this.HasOptional(x => x.User) 
      .WithRequired(x => x.Person).WillCascadeOnDelete(false); 

     this.HasMany(a => a.Addresses).WithOptional().WillCascadeOnDelete(true); 
    } 
} 

繼承類:

public partial class ClientRep : Person 
{ 
    public ClientRep() 
    { 
     this.Jobs = new ObservableCollection<Job>(); 
    } 
    public int ClientId { get; set; } 
    public bool? IsPrimaryContact { get; set; } 
    public string JobContactType { get; set; } 
    public Client Client { get; set; } 
    public ICollection<Job> Jobs { get; set; } 
} 
public class ClientRepMap : EntityTypeConfiguration<ClientRep> 
{ 
    public ClientRepMap() 
    { 
     this.HasKey(t => t.Id); 

     this.Property(t => t.Id) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

     this.ToTable("People_ClientRep"); 
     this.Property(t => t.ClientId).HasColumnName("ClientId"); 
     this.Property(t => t.IsPrimaryContact).HasColumnName("IsPrimaryContact"); 
     this.Property(t => t.JobContactType).HasColumnName("JobContactType"); 
     this.Property(t => t.Id).HasColumnName("Id"); 

     this.HasMany(t => t.Jobs) 
      .WithMany(t => t.ClientReps) 
      .Map(m => 
       { 
        m.ToTable("JobClientRep"); 
        m.MapLeftKey("ClientRep_Id"); 
        m.MapRightKey("Job_Id"); 
       }); 

     this.HasRequired(t => t.Client) 
      .WithMany(t => t.ClientReps) 
      .HasForeignKey(d => d.ClientId).WillCascadeOnDelete(false); 
    } 
} 

然後在我的DbContext:

public partial class ProgramDbContext : DbContext, IProgramDbContext 
{ 
    static OrionDbContext() 
    { 
     Database.SetInitializer(new OrionContextSeedInitializer()); 
    } 
    public OrionDbContext() 
     : base("ConnectionString") 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
     this.Configuration.ProxyCreationEnabled = false; 
    } 
    //No DbSet for Person 
    public IDbSet<ClientRep> ClientRep { get; set; } 
    public IDbSet<ContactPerson> ContactPerson { get; set; } 
    public IDbSet<OtherPerson1> OtherPerson1{ get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //modelBuilder.Conventions.AddBefore<StoreGeneratedIdentityKeyConvention>(new InheritanceKeyConvention()); 
     //modelBuilder.Conventions.Remove<StoreGeneratedIdentityKeyConvention>(); 

     //abridged 
     modelBuilder.Configurations.Add(new PersonMap()); 
     modelBuilder.Configurations.Add(new ClientRepMap()); 
     modelBuilder.Configurations.Add(new ContactPersonMap()); 
     modelBuilder.Configurations.Add(new OtherPerson1Map()); 

     //modelBuilder.Entity<Person>() 
     // .Property(a => a.Id) 
     // .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    } 

這似乎與StoreGeneratedIdentityKeyConvention - 這似乎將身份分配給我的所有其他實體,但是這一個不會'沒有得到它......我假設它是一個抽象類。我試圖用以下設置覆蓋該配置:

modelBuilder.Entity<Person>() 
.Property(a => a.Id) 
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

但它仍然存在衝突。

+0

Posted ..不想用無用的代碼吹捧大家,但是有一個繼承類的例子。其他4個基本相同,只是不同的屬性。我也把我的DbContext,或至少它的一些部分。感謝您的期待! – 2014-11-21 22:41:55

+0

我也注意到,我有我的繼承類DbSets,但不是基類。這與我在一些參考文獻中看到的不符......這是不正確的嗎? – 2014-11-21 22:44:24

+0

我確實刪除了繼承類的DbSets,並添加了基類,因爲我相信這是正確的,但它沒有什麼區別。 – 2014-11-21 22:52:53

回答

3

那麼這是8小時的荒謬冒險!

Backstory:我首先通過執行反向工程現有數據庫導入代碼。

生成我的繼承實體有一個主鍵,但不是他們的身份。我刪除了所有到Id屬性的映射,因爲它不存在於繼承的實體上,只存在於基礎上。 (這一切都使得現在這麼多的意義......嘖,什麼是一天中的浪費!)

我的繼承類&映射現在看起來是這樣的:

public partial class ClientRep : Person 
{ 
    public ClientRep() 
    { 
     this.Jobs = new ObservableCollection<Job>(); 
    } 
    public int ClientId { get; set; } 
    public bool? IsPrimaryContact { get; set; } 
    public string JobContactType { get; set; } 
    public Client Client { get; set; } 
    public ICollection<Job> Jobs { get; set; } 
} 
public class ClientRepMap : EntityTypeConfiguration<ClientRep> 
{ 
    public ClientRepMap() 
    { 
     this.ToTable("People_ClientRep"); 
     this.Property(t => t.ClientId).HasColumnName("ClientId"); 
     this.Property(t => t.IsPrimaryContact).HasColumnName("IsPrimaryContact"); 
     this.Property(t => t.JobContactType).HasColumnName("JobContactType"); 
     this.HasMany(t => t.Jobs) 
      .WithMany(t => t.ClientReps) 
      .Map(m => 
       { 
        m.ToTable("JobClientRep"); 
        m.MapLeftKey("ClientRep_Id"); 
        m.MapRightKey("Job_Id"); 
       }); 
     this.HasRequired(t => t.Client) 
      .WithMany(t => t.ClientReps) 
      .HasForeignKey(d => d.ClientId).WillCascadeOnDelete(false); 
    } 
} 

一旦我刪除那些從殘存逆向工程師,根據需要生成一切。