在一个事务中调用SaveChanges两次

时间:2013-03-11 03:49:55

标签: asp.net-mvc entity-framework

所有,我是新来的。我的问题是如何在一个事务中调用savechanges两次。 以下是我的代码:

var order = new Order();

// modify order's properties

db.orders.add(order);
db.SaveChanges();

db.Entry(order).reload();

// do some other work about the order entity
db.Entry(order).state = EntityState.Modified;
db.SaveChanges();

但第二次SaveChanges失败了。错误消息“影响意外的行数(0)。在加载后,可以修改或删除实体.Refresh ObjectStateManager”。

我的问题是如何使第二个SaveChanges()工作。因为order实体中的属性代码是基于数据库中自定义函数的自动增加自定义字符串字段。

由于

1 个答案:

答案 0 :(得分:0)

您不需要调用.Reload(),并且如果您没有将AutoDetectChangesEnabled从其默认值设置为true,则不应该将@State设置为已修改。

您应该能够遵循此模式并获得所需的结果。无论是否使用TransactionScope,您都可以执行以下操作。使用TransactionScope的好处是,如果第二次调用SaveChanges()失败并出现异常,则第一次调用所做的更改将被回滚。另一方面,如果你想第一次调用SaveChanges()成功,即使第二次调用失败,你应该删除TransactionScope代码。

using (var db = new MyContext())
using (var scope = new TransactionScope())
{
    var order = new Order();

    // modify order's properties

    db.orders.add(order);
    db.SaveChanges();

    // make additional changes...
    // E.g. assuming order.ID is an auto-incrementing primary key
    // that is determined by the database I can now use the
    // value the database set to log this change...

    // save changes
    db.SaveChanges();

    // commit the transaction
    scope.Complete();
}