首页 > 解决方案 > 如何覆盖数据库中的数据?[ASP.NET]

问题描述

此代码将我的数据保存到数据库中。该应用程序记录每月每一天花费的时间。

他们使用 EF 写入 SQL Server 中的数据库。问题只是我希望他们覆盖而不是写更多

控制器:

List<Karta_Model> objNextKartaModel = new List<Karta_Model>();

for (int i = 0; i < liczbaDni; i++)
{
     var modelNext = new Karta_Model()
     {
         Login = userName,
         Rok = numerRoku,
         Miesiac = numerMiesiaca,
         DzMiesiaca = modelKarta.Model1[i].DzMiesiaca.Value,
         DzTygodnia = modelKarta.Model1[i].DzTygodnia,
         Rozpoczecie = modelKarta.Model1[i].Rozpoczecie
         ....
    };

    objNextKartaModel.Add(modelNext);

    await _ecpContext.Karta.AddRangeAsync(objNextKartaModel);
    await _ecpContext.SaveChangesAsync();
}

Id在 SQL Server 中定义为:

[Id] [int] IDENTITY(1,1)

我想出了从之前保存的数据库中提取第一行 ID 的想法

var nrIdBase = _ecpContext.Karta
                          .FirstOrDefault(f => f.DzMiesiaca == 1 && 
                                               f.Miesiac == numerMiesiaca && 
                                               f.Rok == numerRoku && 
                                               f.Login == userName).Id;

但我不知道如何使用它。

我试过这样的事情:

for (int i = 0; i < liczbaDni; i++)
{
     var modelNext = new Karta_Model()
     {
         Id = nrIdBase +i,
         Login = userName,
         Rok = numerRoku,
         Miesiac = numerMiesiaca,
         DzMiesiaca = modelKarta.Model1[i].DzMiesiaca.Value,
         DzTygodnia = modelKarta.Model1[i].DzTygodnia,
         Rozpoczecie = modelKarta.Model1[i].Rozpoczecie
         ....
     };
}

但我收到一个错误:

InvalidOperationException:无法跟踪实体类型“Karta_Model”的实例,因为已经在跟踪具有相同键值 {'Id'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。

有谁知道如何做到这一点?

如何覆盖一次保存的数据?

标签: c#asp.netasp.net-mvcasp.net-core

解决方案


为了更新数据库中的现有记录,您需要在更新操作之前拥有它的 ID。

然后你可以这样做:

var existingRecord = _ecpContext.Karta.FirstOrDefault(x => x.Id == theExistingId);

if (existingRecord != null) {
  existingRecord.Login = "CHANGED";
  await _ecpContext.SaveChangesAsync()
}

您正在使用的此调用:

await _ecpContext.Karta.AddRangeAsync(objNextKartaModel);

仅用于向数据库添加新项目。


推荐阅读