2013-03-11 133 views
0

全部,我是新来的。我的问题是如何在一个事务中调用savechanges两次。 下面是我的代码:在一次交易中调用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)。实体可能会在加载后被修改或删除。刷新ObjectStateManager”。

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

感谢

+0

如果您尚未将AutoDetectChangesEnabled设置为false,则不需要手动设置状态 – maxlego 2013-03-11 09:42:00

回答

0

您的来电.Reload()是不需要的,并作为@maxlego提到.STATE设置修改不应该需要,如果你还没有从它的真正的默认值更改AutoDetectChangesEnabled。

你应该能够遵循这种模式,并获得所需的结果。您可以使用或不使用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(); 
}