C# EF SaveChanges未保存且未引发异常

C# EF SaveChanges未保存且未引发异常,c#,asp.net,database,entity-framework,asp.net-web-api,C#,Asp.net,Database,Entity Framework,Asp.net Web Api,我有一个方法,创建一个新用户,然后在用户权限表中插入一行,但什么都没有发生。这是我的密码: // before: creates user var permission = new UserPermission() { UserId = user.Id, UserName = user.UserName, Assets = createUserModel.Assets }; AccountDb.UserPermissions.Add(permission); var

我有一个方法,创建一个新用户,然后在用户权限表中插入一行,但什么都没有发生。这是我的密码:

// before: creates user

var permission = new UserPermission()
{
    UserId = user.Id,
    UserName = user.UserName,
    Assets = createUserModel.Assets
};

AccountDb.UserPermissions.Add(permission);
var saveChangesResult = AccountDb.SaveChanges();

if (saveChangesResult == 0) // the result is always 0
{
    AppUserManager.Delete(user);
    return BadRequest("User permission could not be saved");
}

// then: add user to role and return ok
SaveChanges始终返回0且不更新数据库,我已经在谷歌上搜索了它并尝试了以下操作:

// no success
AccountDb.UserPermissions.Attach(permission);

// no success either
AccountDb.Entry(permission).State = EntityState.Added;
我也尝试了异步方法,但没有成功。 以下是我的“用户权限”模型:

--编辑2--


我使用了Azure db字符串,并更改为本地db字符串,但问题仍然是一样的,UserPermissions表不会更新,也不会发出错误。

您正在创建一个新用户,但从未使用结果。您的
user.Id
始终为空(或相应的默认值)

我不知道为什么数据库会悄无声息地失败(约束或外键会引发异常),但您应该首先修复它。这可能会导致写入真实记录。

我找到了一个解决方案

出于某种原因,AccountContext的本地实例是问题所在,它获取所有用户权限,但不更新。因此,我创建了一个新实例并尝试添加权限:

using (var db = new AccountContext())
{
     db.UserPermissions.Add(permission);
     var saveChangesResult = db.SaveChanges();

     if (saveChangesResult == 0)
     {
         AppUserManager.Delete(user);
         return BadRequest("User permission could not be saved");
     }
}  

现在它工作得很好。但是我不知道为什么本地AccountDb现在不工作,如果它在过去工作过

它可能正在更新错误的数据库。您确定您的目标连接字符串正确吗?如果添加
AccountDb.Database.Log+=Console.WriteLine,会发生什么在保存之前,是否执行了任何SQL?如果是这样,什么SQL?你没有隐藏在某个地方的事务?@DavidBrowne-Microsoft如果它更新了错误的数据库,SaveChanges不会仍然返回1吗?你能添加创建用户代码吗?“创建用户”在“创建用户”和“添加权限”中使用相同的上下文?用户创建工作正常,它正在生成一个ID:@Eduardorostolato哦,您正在修改输入参数吗?好啊这很奇怪,但我想在语言范围内可以这样做。有哪些输入参数?您的Create方法会写入它获得的用户。这对我来说是出乎意料的。你说的是
返回Ok(modelFactory.Create(user))
[HttpPost]
[Route("create")]
public IHttpActionResult CreateUser(CreateUserBindingModel createUserModel)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    if (createUserModel.RoleName is null)
    {
        return BadRequest("There is no role assigned to user");
    }

    var user = new UserModel()
    {
        UserName = createUserModel.UserName,
        Email = createUserModel.Email,
        FirstName = createUserModel.FirstName,
        LastName = createUserModel.LastName
    };

    var addUserResult = AppUserManager.Create(user, createUserModel.Password);

    if (!addUserResult.Succeeded)
    {
        return GetErrorResult(addUserResult);
    }

    var permission = new UserPermission()
    {
        UserId = user.Id,
        UserName = user.UserName,
        Assets = createUserModel.Assets
    };

    AccountDb.UserPermissions.Add(permission);
    var saveChangesResult = AccountDb.SaveChanges();

    if (saveChangesResult == 0)
    {
        AppUserManager.Delete(user);
        return BadRequest("User permission could not be saved");
    }

    var addRoleResult = AppUserManager.AddToRole(user.Id, createUserModel.RoleName);

    if (!addRoleResult.Succeeded)
    {
        AppUserManager.Delete(user);
        return GetErrorResult(addUserResult);
    }

    return Ok(TheModelFactory.Create(user));
}
using (var db = new AccountContext())
{
     db.UserPermissions.Add(permission);
     var saveChangesResult = db.SaveChanges();

     if (saveChangesResult == 0)
     {
         AppUserManager.Delete(user);
         return BadRequest("User permission could not be saved");
     }
}