使用实体框架删除和插入实体

时间:2017-08-10 18:05:05

标签: c# entity-framework

假设我有两个实体E1E2共享相同的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确实反映了已经发生的变化?

2 个答案:

答案 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代表评论,否则我会在回答之前使用评论来更清晰)干杯!