我正在向数据库循环添加多个新行,然后保存更改。但是我有一个跨 3 列的唯一索引,所以我需要先检查它们是否存在以防止异常。
问题是,直到 SaveChanges()
之后才找到我添加到上下文中的行,因此重复检查不起作用。所以在添加所有行之后,当我执行 SaveChanges()
时,我得到一个重复的异常。
foreach (var row in json["data"]["animals"])
{
var newRow = new Animal
{
Prop1 = row["prop1"].ToString(),
Prop2 = row["prop2"].ToString(),
Prop3 = row["prop3"].ToString(),
}
if (db.Animals.Where(p => p.Prop1 == newRow.Prop1 && p.Prop2 == newRow.Prop2 && p.Prop3 == newRow.Prop3).FirstOrDefault() == null)
{
db.Animals.Add(newRow);
// db.SaveChanges(); // If I put this here instead, it works (no duplicate exception)
}
}
db.SaveChanges(); // This throws the duplicate exception
是否必须在添加每一行后保存更改?或者我是否缺少更好的方法来执行此操作,因为这似乎效率低下/不正确。
最佳答案
那是因为你的 json 数据 animals 中有重复的值,首先清除列表中的重复行:
// Linq is required
// using System.Linq;
// Map your json to a animal queryable;
var animals = json["data"]["animals"].Select(row => new Animal {
Prop1 = row["prop1"].ToString(),
Prop2 = row["prop2"].ToString(),
Prop3 = row["prop3"].ToString()
});
// Select only unique values
animals = animals.GroupBy(a=>new { a.Prop1, a.Prop2, a.Prop3 }).Select(a => a.First());
// Your logic to insert
foreach (var newRow in animals)
{
if (!db.Animals.Any(p => p.Prop1 == newRow.Prop1 && p.Prop2 == newRow.Prop2 && p.Prop3 == newRow.Prop3))
{
db.Animals.Add(newRow);
// db.SaveChanges(); // If I put this here instead, it works (no duplicate exception)
}
}
db.SaveChanges(); // This throws the duplicate exception
关于c# - Entity Framework Core 使用 Unique 检查添加多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58681092/