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?
This is some bug of EDMX model generator in Visual Studio.
To solve this do:
I have Visual Studio 2015 udpate 3