[英]c# entity framework throw exception but no roll back on database
我有一個簡單的查詢,它更新了我的數據庫中的兩個表
public void UpdateLogins(int userId)
{
using (var context = new storemanagerEntities())
{
user item = context.users.Where(x => x.id == userId).FirstOfDefault();
item.logins += 1;
context.SaveChanges();
account accountItem = context.accounts.Where(x => x.userId == userId).FirstOfDefault();
accountItem.logins += 1;
context.SaveChanges();
}
}
但如果我只是“拋出新的異常();” 他們之間是這樣的
context.SaveChanges();
throw new Exception();
account accountItem = context.accounts.Where(x => x.userId == userId).FirstOfDefault();
用戶表未更新,但我的帳戶表尚未更新,數據庫保存這些更改。 如果拋出異常,如何告訴我的數據庫回滾更改?
謝謝
試試這個 :
using (TransactionScope txScope = new TransactionScope())
{
using (var context = new storemanagerEntities())
{
user item = context.users.Where(x => x.id == userId).FirstOfDefault();
item.logins += 1;
context.SaveChanges();
account accountItem = context.accounts.Where(x => x.userId == userId).FirstOfDefault();
accountItem.logins += 1;
context.SaveChanges();
}
txScope.Complete();
}
每個.SaveChanges都是一個交易。 所以你有2個。
正如其他人所指出的那樣,將所有內容包含在父TransactionScope中,然后這些將成為子事務。
即你將有1筆交易。
或者更好地只調用一次.SaveChanges()
使用模型時,應使用C#引用來連接模型,而不是使用ID。 有時這很困難,但這是ORM的目標,讓你以OO術語工作。
用戶可以擁有一個帳戶屬性,這是一個OO術語的連接,而不是ID。 帳戶 - 用戶屬性相同。
訂單實例可以具有List OrderDetails屬性。
看看這里有很好的例子: EF Code First Cookbook - 食譜#4:向主實體添加細節
你可以試試這個:
數據將保存到數據庫,但在Scope.Complete()完成之前不會提交。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.