我正在使用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。
答案 0 :(得分:0)
在我看来,您的问题在于尝试截断表并手动清除DbSet
的本地版本。您应该只更改EF实体并保存它们,然后这些更改将反映在数据库中。
这应该有效:
_lisDatabase.SortedTubes.RemoveRange(_lisDatabase.SortedTubes);
_lisDatabase.SortedTubes.Add(new SortedTube());
_lisDatabase.SaveChanges();
或者,试试这个:
答案 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 属性的类型。但我不知道为什么。 如果有人想解释我这个案子?
感谢大家的帮助。