[英]Code First TPT Inheritance - How can I supply the foreign key instead of EF creating the parent row for me?
[英]EF inheritance with TPT - how to specify the foreign key column name?
我想將兩個派生類映射到兩個表(TPT)
[Table("User")]
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
[Table("Employee")]
public class Employee : User
{
public int UserId { get; set; }
public string DeptName { get; set; }
}
這些表已經存在(即我無法修改架構),並且定義如下:
請注意,表Employee
UserId
列既是它的PK,也是表User
Id
的FK。
DbContext盡可能直接-沒有定義流利的映射。
public class TestInheritContext : DbContext
{
public DbSet<User> Users { get; set; }
}
嘗試訪問Users
集合時,出現以下EF異常:
System.Data.SqlClient.SqlException:無效的列名“ Id”。
顯然,它嘗試從表Employee
讀取列Id
。
我看到的所有TPT示例在所有表中都使用相同的PK列名稱。 例如, 這個 。
我如何解決它?
弄清楚了。
首先,為了進行調試,查看EF在幕后創建的實際映射很有幫助。
我安裝了EF Power Tools
VS擴展程序,右鍵單擊上下文文件,
Entity Framework -> View Entity Data Model
並得到了:
注意,實體Employee
既具有自己的UserId
屬性, 又具有繼承的Id
屬性。
所以我要做的第一件事是從派生類中刪除UserId
屬性:
[Table("Employee")]
public class Employee : User
{
// not needed
//public int UserId { get; set; }
public string DeptName { get; set; }
}
但是,這還不夠。 現在,我有了基類的Id
屬性,該屬性必須指向兩個不同名稱的列,具體取決於它來自哪個表/實體:
對於User
:ID => ID
對於Employee
:Id => UserId
我無法為此使用屬性,因此我將使用流暢的語法。
對於User
的實體,我沒有做任何事情,因為列名相匹配的屬性名稱。
對於Employee
實體,我必須進行干預:
public class TestInheritContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.Property(e => e.Id)
.HasColumnName("UserId");
}
}
最終產生正確的映射:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.