3 回答

TA貢獻1780條經驗 獲得超1個贊
它從哪里獲取 InterfaceID?
首先,應該清楚它不是來自所示的“簡單”(但顯然不完整)模型。
EF生成的SQL清楚地表明你沒有重命名PK屬性生成的列,也沒有Discriminator列,所以它不能來自繼承。而且您明確定義了一個名為的影子屬性InterfaceID而沒有注意到它的可能性很小。
所有這一切,以及該名稱與 FK 屬性/列名稱的 EF Core 常規名稱之一相匹配的事實InterfaceID清楚地表明了由關系引入的常規 FK。例如有這樣的第二個模型:
public class Interface
{
public int ID { get; set; }
// or
// public int InterfaceID { get; set; }
public ICollection<InterfaceType> InterfaceTypes { get; set; }
}
如關系 - 單一導航屬性EF Core 文檔主題中所述:
僅包含一個導航屬性(沒有反向導航,也沒有外鍵屬性)就足以具有約定定義的關系。
并且隨附的示例顯示了Blog/Post模型,其中僅突出顯示了public List<Post> Posts { get; set; }屬性。Blog
所有 EF Core 運行時行為都基于模型元數據。數據庫的結構是什么并不重要,更重要的是 EF Core 認為它基于您的模型類、數據注釋和流暢的配置,以及是否與數據庫架構匹配。更簡單的檢查方法是生成遷移并檢查它是否與數據庫模式匹配。
因此,如果關系是有意的,那么您必須更新數據庫以匹配您的模型。否則,您需要更新模型以匹配數據庫 - 通過刪除或忽略集合導航屬性(或更正導致差異的無效數據注釋/流暢配置)。

TA貢獻1799條經驗 獲得超6個贊
我的猜測是,您還在上下文中注冊了一個“接口”表,該表包含對 InterfaceType 的引用。Interface 將聲明一個 InterfaceTypeId 字段,但是對于 EF,如果您將 HasOne 與 ForeignKey 一起使用,請檢查您是否意外分配了以下內容:
.HasOne(x => x.InterfaceType).WithOne().HasForeignKey<InterfaceType>("InterfaceId");
在具有 InterfaceType 的接口的情況下,它將被映射得更像:
.HasOne(x => x.InterfaceType).WithMany();
這可能已經潛入您的其他關聯實體之一。通常這些是自動完成選擇錯誤類型而您沒有注意到的錯別字。如果您的任何類上都存在該映射,則 EF 將期望在 InterfaceType 上找到一個 InterfaceId 列。搜索一下HasForeignKey<InterfaceType>
,看看有沒有什么不尋常的地方。
- 3 回答
- 0 關注
- 251 瀏覽
添加回答
舉報