如何覆盖数据库中的数据?[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();
}

SQL Server 中的Id定义为:

[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"来查看冲突的键值。

有人知道如何做到这一点吗?

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

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

然后你可以这样做:

var existingRecord = _ecpContext.Karta.FirstOrDefault(x => x.Id == theExistingId);
if (existingRecord != null) {
existingRecord.Login = "CHANGED";
await _ecpContext.SaveChangesAsync()
}

您正在使用的此调用:

await _ecpContext.Karta.AddRangeAsync(objNextKartaModel);

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

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

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
}

最新更新