【发布时间】:2018-01-19 02:43:04
【问题描述】:
假设我有两个实体 E1 和 E2 都共享相同的 Code 值。假设我要删除第一个并插入下一个:
Item.Delete(E1);
Item.Insert(E2);
Item.Save();
在哪里
public void Delete(Entity E)
{
var existingEntity = _context.EntityTable.SingleOrDefault(s => s.Code == E.Code);
_context.EntityTable.Remove(existingEntity);
}
public void Insert(Entity E)
{
var existingEntity = _context.EntityTable.FirstOrDefault(s => s.Code == E.Code);
if (existingEntity != null){
throw new ArgumentException("Item alread exists.")
}
var newEntity = CreateDbEntity(E); // Create Db Entity just convert the type. Nothing much here.
_context.EntityTable.Add(newEntity);
}
public void Save()
{
_context.SaveChanges();
}
这里的问题是,当我从_context 中的EntityTable 中删除E1 时,在我保存之前不会立即反映出来。因此,操作将失败,因为插入E2 仍然不成功,因为 E1 仍然存在。有没有解决这个问题的方法,EntityTable 确实反映了所做的更改?
【问题讨论】:
-
为什么不将唯一条件留给 SQL 而不签入代码?
-
在您查询一个是否存在和您调用 SaveChanges() 之间,也可以由另一个进程或线程插入一个。不要在代码中这样做。
-
删除>保存>插入>保存..大声笑
-
@johnny5 这个例子很简单。但在软删除的情况下,SQL 中的唯一条件将不起作用。
-
@Husain,你为什么不检查实体的状态,看看它是否被删除?
var existingEntity = _context.EntityTable.Any(s => s.Code == E.Code && _context.Entry(s).State != EntityState.Deleted);
标签: c# entity-framework