1. 程式人生 > 實用技巧 >關於EFCORE關聯表新增時出現的錯誤Microsoft.AspNetCore.Server.Kestrel[13] Connection id "0HM2L9PKHGR69", Request id "0HM2L9PKHGR69:00000003": An unhandled exception was thrown by the application.

關於EFCORE關聯表新增時出現的錯誤Microsoft.AspNetCore.Server.Kestrel[13] Connection id "0HM2L9PKHGR69", Request id "0HM2L9PKHGR69:00000003": An unhandled exception was thrown by the application.

最近再用ABP做專案,也是第一次用.net core做實際的專案,中間遇到了各種問題,記錄一下其中一個問題

在做新增時使用了core first關聯表新增

在主表實體中加入明細資訊

public virtual ICollection<BT_Inv_Stockin_Detail> BT_Inv_Stockin_Detail { get; set; }

在明細中加入主表的實體

public virtual BT_Inv_Stockin BT_Inv_Stockin { get; set; }

然後再DBContext中重寫OnModelCreating

protected override
void OnModelCreating(ModelBuilder modelBuilder) { //先呼叫基類的OnModelCreating方法,設定資料庫中其它表和實體的對映關係 base.OnModelCreating(modelBuilder); // 設定BT_Inv_Stockin和BT_Inv_Stockin_Detail主從表關係 modelBuilder.Entity<BT_Inv_Stockin>(entity => { entity.HasMany(x
=> x.BT_Inv_Stockin_Detail)//設定BT_Inv_Stockin可以通過屬性BT_Inv_Stockin_Detail可以找到多個BT_Inv_Stockin_Detail實體,一對多關係 .WithOne(x => x.BT_Inv_Stockin)//設定BT_Inv_Stockin_Detail可以找到一個BT_Inv_Stockin,表示多對一關係 .HasPrincipalKey(p => p.Id)//設定BT_Inv_Stockin主表的關係鍵 .HasForeignKey(l => l.EntryID)//
設定BT_Inv_Stockin_Detail從表的關係鍵 .OnDelete(DeleteBehavior.ClientSetNull);//設定級聯刪除效果 }); }

在使用時將包含主表和明細資訊的json轉換,使用AutoMap對應,新增主表就可以實現主表明細同時新增,並且可以對應新增外來鍵

var stockin = mapper.Map<BT_Inv_Stockin>(dto);
var stockdetailin = mapper.Map<List<BT_Inv_Stockin_Detail>>(dto.BT_Inv_Stockin_Detail);
var date = await stockInRepository.InsertAsync(stockin);

這樣做,雖然實現了增加的效果,但是swagger包了500的錯誤

除錯也沒有catch出來,然後在控制檯找到了報錯

大概意思是因為實體是主表和明細表之後專案引用導致了內迴圈,從前面的報錯資訊查不到資料,後來從Newtonsoft.Json入手,找到了解決方案:

主要問題還是落在Self referencing loop detected for property這裡

方法很簡單,

在BT_Inv_Stockin_Detail導航屬性上加[JsonIgnore]特性來忽略該屬性。

[JsonIgnore]
public virtual BT_Inv_Stockin BT_Inv_Stockin { get; set; }

當然,也可以去掉關聯關係,不使用關聯新增,但是這樣治標不治本。

解決方案參考地址:https://www.cnblogs.com/taoshengyujiu/p/7725510.html