簡體   English   中英

使用TPT進行EF繼承-如何指定外鍵列名稱?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM