EF SaveChanges不保存而不抛出异常

时间:2018-01-19 14:22:30

标签: 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 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并且没有更新数据库,我已经用Google搜索并尝试了以下操作:

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

// no success either
AccountDb.Entry(permission).State = EntityState.Added;

我也试过异步方法,但没有运气。 这是我的" UserPermission"模型:

public class UserPermission
{
    public int Id { get; set; }

    public string UserId { get; set; }

    public string UserName { get; set; }

    public string _Assets { get; set; }

    [NotMapped]
    public List<int> Assets
    {
        get
        {
            if (_Assets == null) return null;
            return Array.ConvertAll(_Assets.Split(';'), Int32.Parse).ToList();
        }
        set
        {
            _Assets = String.Join(";", value.Select(x => x.ToString()).ToArray());
        }
    }
}

很奇怪,因为这种方法最近起作用了,但在&#34; AccountContext&#34;之后发生了一些变化。和一些角色,我注意到这个方法已经不再适用了。

- 编辑 -

这是完整的创建方法

[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));
}

- 编辑2 -

我使用的是Azure数据库字符串,但我更改为本地数据库字符串,但问题仍然相同,UserPermissions表不会更新,也不会发出错误。

2 个答案:

答案 0 :(得分:1)

您正在创建新用户,但您从不使用结果。您的user.Id 总是为空(或相应的默认值)。

我不知道为什么你的数据库无声地失败(约束或外键应该抛出异常),但是你应该先修复它。它可能会导致写入真实的记录。

答案 1 :(得分:0)

我找到了解决方案!

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

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现在不工作,如果它在过去工作