簡體   English   中英

要在 EF Core 中添加不帶外鍵的導航屬性,使用 .NET Core Web API 進行 DB 優先遷移

[英]To add navigation property without foreign key in EF Core, DB-first migration with .NET Core Web API

我正在使用現有系統並將其更新到 .NET Core、Web API 和 EF Core。

現有系統有 2 個表:

  • 父表:id、name等。
  • 子表:Id、ParentId、name等。

雖然ParentId存在於子表中,但沒有外鍵引用,但我希望在查詢父表時能夠使用 include。 我已經要求不要添加 FK 作為刪除它們將 -ve 值放入parentId列的一部分。 通過這種方式,他們可以將其帶回來,並以這種方式構建遺留系統。

現在,在 db-first 遷移中,如何在沒有 fk 的情況下指定導航屬性,以便我的 EF Core 執行關系; 或者至少將它們一起歸還。 添加可為空的外鍵不是一個選項,因為當添加 -ve 值時它會破壞系統。

我確實建議完全清理數據庫並擺脫 -ve 值,但這涉及大量測試並且沒有可交付成果。 長話短說,如何在數據庫首次遷移中添加沒有外鍵的導航屬性?

我嘗試在 model 中添加集合和虛擬條目,但遷移后它被覆蓋了。 我已經按照本文檔在模型構建器上使用 HasMany 添加了這個 - https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key% 2C簡單鍵

但是腳手架覆蓋了我的導航屬性

我找到了答案。

在 EF 核心 3.x 中,由 DBFrist 腳手架創建的 dbcontext 都是部分類。 所以我做了以下事情: 1. 上下文 class 的新部分 class - 這里我使用 OnModelCreatingPartial() 方法添加了導航屬性的關系。 下面的例子

public partial class dbContext : DbContext
{
    partial void OnModelCreatingPartial(ModelBuilder builder)
    {
        builder.Entity<Packcomponent>()
        .HasOne(p => p.Pack)
        .WithMany(b => b.PackComponent)
        .HasForeignKey(p => p.PackId);
    }
}
  1. 在新文件中擴展了部分 class 並在那里添加了導航屬性。

     public partial class Packcomponent { public Pack Pack { get; set; } } public partial class Pack { public List PackComponent { get; set; } }

這樣在搭建腳手架時它不會覆蓋自定義導航屬性,我也可以使用此屬性來執行 EF 操作,例如.Include() 並保存相關實體。 真是太棒了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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