假设我有两个实体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();
}
这里的问题是,当我从E1
中的EntityTable
中删除_context
时,直到我保存才会立即反映出来。因此,操作将失败,因为插入E2
窗口不成功,因为E1仍在那里。是否有工作,EntityTable
确实反映了已经发生的变化?
答案 0 :(得分:1)
每次操作后简单调用SaveChanges
。
您希望在初始化上下文时创建事务(这可确保执行两个操作):
_context = new FooEntities();
_transaction = _context.Database.BeginTransaction();
然后,您的Save
方法将提交事务:
_transaction.Commit();
处理上下文和事务不会有害,但我相信你已经这样做了;)
另一方面,既然你抛出了一个例外:
if (existingEntity != null){
throw new ArgumentException("Item alread exists.")
}
为什么不在代码列上创建unique constraint?这样数据库就会抛出异常;)
答案 1 :(得分:0)
看起来你只是有一个操作顺序错误,这可能不是最有效的方法,但它应该照顾你的问题。
Item.Delete(E1);
Item.Save();
Item.Insert(E2);
Item.Save();
按顺序打电话给他们。
或者您可以将save方法添加到删除和插入方法中,以便在执行每个方法时保存,您只需要使用两行。
public void Delete(Entity E)
{
var existingEntity = _context.EntityTable.SingleOrDefault(s => s.Code == E.Code);
_context.EntityTable.Remove(existingEntity);
Save()
}
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);
Save()
}
public void Save()
{
_context.SaveChanges();
}
然后你可以像
一样调用它Item.Delete(E1);
Item.Insert(E2);
希望这有帮助!如果没有让我知道,我将删除答案(我必须使用答案,因为我不能在50代表评论,否则我会在回答之前使用评论来更清晰)干杯!