我有以下示例 JSON(簡化):
{
"programmes":[
{
"programmeID":"163",
"title":"Programme 1",
"color":"#ff5f57",
"moderators":[
{
"moderatorID":"27",
"name":"Moderator 1",
}
]
},
{
"programmeID":"153",
"title":"Programme 2",
"color":"#ff5f57",
"moderators":[
{
"moderatorID":"27",
"name":"Moderator 1",
}
]
},
]
}
我想轉換成以下物件:
public class Programme
{
[Key]
public string programmeID { get; set; }
public string title { get; set; }
//Navigational Property
public virtual ICollection<Moderator> moderators { get; set; }
}
public class Moderator
{
[Key]
public string moderatorID { get; set; }
public string name { get; set; }
//Navigational Property
public virtual ICollection<Programme> programmes { get; set; }
}
一切都很好,物件看起來很棒,填充正確,但是當嘗試保存到 db 時出現此錯誤:
無法跟蹤物體型別“主持人”的實體,因為已在跟蹤另一個具有鍵值“{moderatorID:27}”的實體。附加現有物體時,請確保僅附加一個具有給定鍵值的物體實體。
使用程式串列呼叫 .Add 時會發生此錯誤:
List<Programme> programmes;
programmes = JsonSerializer.Deserialize<List<Programme>>(JSONcontent);
//... db init
db.AddRange(programmes);
我知道主持人(ID = 27)存在雙重性,但我認為這在 JSON 中是很正常的模式。我可以做一些解決方法,但想知道是否有任何最佳實踐可以直接在 EF 中處理這個問題?
uj5u.com熱心網友回復:
您不能將通過反序列化創建的子代添加為已存在的子代。解決方案之一是首先找到存在的孩子
List<Programme> programmes = JsonSerializer.Deserialize<List<Programme>>(JSONcontent);
foreach (var program in programmes)
{
var moderators=new List<Moderator>();
foreach (var moderator in program.moderators)
{
var existingModerator=db.Moderators.FirstOrDefault(i=>
i.moderatorId=moderator.moderatorId);
moderators.Add(existingModerator);
}
programm.moderators=moderators;
}
db.AddRange(programmes);
但我通常更喜歡為多對多關系創建一個顯式類。它將使您的所有代碼更加簡單。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/473960.html
