DbUpdateConcurrencyException:实体可能在加载实体后被修改或删除

时间:2018-01-09 14:00:44

标签: c# entity-framework entity-framework-6

我正在使用EF6。

清除表格后,我想在该表中添加新条目,我收到以下错误:

存储更新,插入或删除语句影响了意外的行数(0)。自实体加载后,实体可能已被修改或删除

删除数据库表的代码:

false

之后,我想使用以下代码向该表添加新条目:

 public void ResetStatistics() {
        _lisDatabase.Database.ExecuteSqlCommand("TRUNCATE TABLE Sortedtubes");
        _lisDatabase.sortedtubes.Local.Clear();
 }

我尝试了EF文档上的sugestions没有运气: https://msdn.microsoft.com/en-us/data/jj592904

修改

问题似乎是 Sortedtubes tube = new Sortedtubes(); tube.Time = time; tube.Milliseconds = time.Millisecond.ToString(); tube.Barcode = barcode; tube.Tubetype = tubeType; tube.Target = target; tube.Materialcode = materialCode; try { _lisDatabase.sortedtubes.Add(tube); _lisDatabase.SaveChanges(); // Error appears here } catch (DbUpdateConcurrencyException ex) { // maybe do something here? } 方法(Clear())。执行此方法后,错误出现在下一个_lisDatabase.sortedtubes.Local.Clear();

之后

那么也许有另一种方法来处理这个问题?我在我的应用程序中有一个GridView,它绑定到sortedtubes实体并清除它,以便在我截断表时也清除GridView。

3 个答案:

答案 0 :(得分:0)

在我看来,您的问题在于尝试截断表并手动清除DbSet的本地版本。您应该只更改EF实体并保存它们,然后这些更改将反映在数据库中。

这应该有效:

_lisDatabase.SortedTubes.RemoveRange(_lisDatabase.SortedTubes);
_lisDatabase.SortedTubes.Add(new SortedTube());
_lisDatabase.SaveChanges();

或者,试试这个:

https://stackoverflow.com/a/10450893/5392513

答案 1 :(得分:0)

我怀疑您通过在SaveChanges表之前跟踪来检索具有相同上下文的数据库中的entiries,当您应用Truncate时,EF正试图通过truncate删除已删除的记录。因此,通常的方法是从上下文创建新实例并应用操作。使用相同的上下文创建长数据库进程并不是一个好主意。因此,在您的情况下,如果您想要truncate表并使用相同的上下文稍后添加新条目,则应在public void ResetStatistics() { _lisDatabase.Database.ExecuteSqlCommand("TRUNCATE TABLE Sortedtubes"); _lisDatabase.sortedtubes.Local.Clear(); foreach (var entry in _lisDatabase.ChangeTracker.Entries<Sortedtubes>()) { _lisDatabase.Entry(entry).State = EntityState.Detached; } } 操作后分离所有跟踪的条目。

.AsNoTracking

此外,如果可以在Truncate表之前的查询中使用{{1}},则无需手动分离条目。

答案 2 :(得分:0)

所以..最终我觉得我有一个解决方案。

我的重置方法现在看起来像这样:

public void ResetStatistics() {
     _lisDatabase.sortedtubes.RemoveRange(_lisDatabase.sortedtubes);
     _lisDatabase.SaveChanges();
}

我的添加保持不变:

_lisDatabase.sortedtubes.Add(tube);
_lisDatabase.SaveChanges();

但是我的Sortedtubes实体中的“大”变化。我将 Time 的类型从 DateTime 更改为普通字符串

从:

[Key]
[Column(Order = 1)]
public DateTime? Time { get; set; }

为:

[StringLength(45)]
public string Time { get; set; }

问题似乎是 Sortedtubes 实体的 Time 属性的类型。但我不知道为什么。 如果有人想解释我这个案子?

感谢大家的帮助。

相关问题