【问题标题】:How to overwrite data in the database? [ASP.NET]如何覆盖数据库中的数据? [ASP.NET]
【发布时间】:2020-02-08 17:32:32
【问题描述】:

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

他们使用 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.net asp.net-mvc asp.net-core


【解决方案1】:

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

那么你可以这样做:

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

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

您正在使用的这个调用:

await _ecpContext.Karta.AddRangeAsync(objNextKartaModel);

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

【讨论】:

  • 我看不懂这段代码。我应该用什么来代替“theExistingId”?
  • 数据库实体的id
【解决方案2】:

按照我上面评论中的想法,您可以做的一件事是在添加新数据之前删除表中的现有数据。

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);

    //Add logic to delete the existing data
    foreach(var model in _ecpContext.Karta)
    {
       _ecpContext.Karta.Remove(model);
    } 

    await _ecpContext.Karta.AddRangeAsync(objNextKartaModel);
    await _ecpContext.SaveChangesAsync();//One SaveChanges call is enough to update the database
}

【讨论】:

  • 这样的逻辑是什么样的?
  • 我添加了一个可能的逻辑,用于在持久化新数据之前删除数据库中的所有数据
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2019-04-28
  • 2013-06-28
相关资源
最近更新 更多