c# - Entity Framework Core 使用 Unique 检查添加多行

标签 c# asp.net-core entity-framework-core

我正在向数据库循环添加多个新行,然后保存更改。但是我有一个跨 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/

相关文章:

c# - 我可以反序列化为 protobuf-net 中接口(interface)的只读属性吗?

mysql - 尝试在与 Pomelo.EntityFrameworkCore.MySql 相关的 dotnet core 3.1 中添加迁移时出错

c# - Serilog 不会生成有效的 json(结构化日志记录)

c# - 如何使用 Entity Framework Core 3.0 创建所需的拥有类型

c# - 通过 ASP.NET 访问同一服务器内的文件夹

c# - 调用堆栈和评估堆栈如何关联?

c# - 如何检查系统日期格式是否与存储在mysql中的不同

asp.net-core - Aspnet core mvc 在验证时更改默认语言

c# - CS0311 C# 该类型不能用作泛型类型或方法中的类型参数 'TContext'。 Entity Framework 核心

c# - 正确的骨料设计和复杂的规范查询