簡體   English   中英

c#實體框架拋出異常但沒有回滾數據庫

[英]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:向主實體添加細節

你可以試試這個:

http://social.msdn.microsoft.com/Forums/en-US/adeb3cf3-db49-40d2-99ae-c14b66fef1e3/rollback-and-commit-using-entity-framework?forum=adodotnetentityframework

數據將保存到數據庫,但在Scope.Complete()完成之前不會提交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM