SaveChanges抛出System.Data.Entity.Core.EntityException

时间:2015-08-13 19:12:00

标签: c# asp.net-mvc entity-framework

我在尝试使用ASP.NET更新MVC 5中的AspNetUsers数据库时遇到问题。

我正在尝试更改用户Credits中的值,该值存储在定义为Models.UserDB2.AspNetUsers的数据库中。

然而,当我尝试这个时,我会抛出这个错误。

  

EntityFramework.SqlServer.dll中出现'System.Data.Entity.Core.EntityException'类型的第一次机会异常   致命错误:在提供程序连接上启动事务时发生错误。有关详细信息,请参阅内部异常。

内部异常:

  

EntityFramework.SqlServer.dll中出现'System.Data.Entity.Core.EntityException'类型的第一次机会异常是内部异常

这是导致错误的代码。

if(player != null) {
    foreach(Models.Item item in itemDB.Items) {
        if(item.UserAssetOptionId == id) {
            if(!item.Owner.ToLower().Equals(username.ToLower())) {
                return Content("false");
            } else {
                item.Owner = "HomeguardDev";
                item.InMarket = true;
                player.Credits += item.Value / 10;
                try {
                    itemDB.SaveChanges();
                    userDB2.SaveChanges();
                    return Content("true");
                } catch(Exception e) {
                    Debug.WriteLine("FATAL ERROR: " + e.Message);
                    return Content("false");
                }
            }
        }
    }
}

如果我只更新itemDB数据库,数据库会更新,但我也需要更新Credits值!

使用数据库的最新模式更新模型,因此没有问题。

任何人都知道发生了什么事?

1 个答案:

答案 0 :(得分:1)

问题是,当您仍在迭代itemDB时,您尝试将更改保存到itemDB.Items,尝试将代码更改为:

if (player != null) {
    foreach(Models.Item item in itemDB.Items) {
        if (item.UserAssetOptionId == id) {
            if (!item.Owner.ToLower().Equals(username.ToLower())) {
                return Content("false");
            } else {
                item.Owner = "HomeguardDev";
                item.InMarket = true;
                player.Credits += item.Value / 10;
                break;
            }
        }
    }
    try {
        itemDB.SaveChanges();
        userDB2.SaveChanges();
        return Content("true");
    } catch (Exception e) {
        Debug.WriteLine("FATAL ERROR: " + e.Message);
        return Content("false");
    }
}

只要您在foreach,就无法开始第二次交易。