我先使用代碼和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);
但它仍然存在衝突。
Posted ..不想用無用的代碼吹捧大家,但是有一個繼承類的例子。其他4個基本相同,只是不同的屬性。我也把我的DbContext,或至少它的一些部分。感謝您的期待! – 2014-11-21 22:41:55
我也注意到,我有我的繼承類DbSets,但不是基類。這與我在一些參考文獻中看到的不符......這是不正確的嗎? – 2014-11-21 22:44:24
我確實刪除了繼承類的DbSets,並添加了基類,因爲我相信這是正確的,但它沒有什麼區別。 – 2014-11-21 22:52:53