2013-03-11 132 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(); 
}