關於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM