最近再用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