I'm using a 'table-per-type' hierarchy in my code-first project (EF5). My derived classes override the default primary-key name to clearly identify this relationship from a database point of view, like so:
/* change primary keys to Chair.ProductId and Table.ProductId */
modelBuilder.Entity<Chair>()
.Property(x => x.Id)
.HasColumnName("ProductId");
modelBuilder.Entity<Table>()
.Property(x => x.Id)
.HasColumnName("ProductId");
Using the following classes as example:
[Table("Product")]
public class Product
{
public int Id {get; set;}
/* generic product properties */
}
[Table("Chair")]
public class Chair : Product
{
/* specific chair properties */
}
[Table("Table")]
public class Table : Product
{
public virtual ICollection<Chair> Chairs {get; set;}
/* specific table properties */
}
Which causes the following error on property Table.Chairs: Column 'Id' specified as part of this MSL does not exist in MetaDataWorkspace.
Which I kinda understand as EF probably didn't see that the PK of Chair Product was changed.. (and still assumes it's called 'Id') But I can't figure out how I instruct EF to use the alternate key.
Thx,
PS. Yes I know, if I don't change the names of the PK's it works... but can it be done using the EF Fluent API?