我有一个方法可以创建一个新用户,然后在用户权限表中插入一行,但什么也没有发生。这是我的代码:
// 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;
我也尝试过异步方法,但没有成功。 这是我的“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());
}
}
}
这很奇怪,因为这个方法最近可以工作,但是在“AccountContext”和一些角色返回进行一些更改之后,我注意到该方法不再工作了。
-- 编辑 --
这是完整的创建方法
[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 表不会更新,也不会发出错误。
您正在创建一个新用户,但您从未使用过结果。您的
user.Id
是 always null(或相应的默认值)。
我不知道为什么你的数据库会默默地失败(约束或外键应该抛出异常),但你应该首先修复它。这可能会导致真实的记录被写入。
我找到了解决方案!
由于某种原因,我的 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 过去可以工作,现在却不能工作
与此案例无关,但我花了几个小时才确定为什么实体没有在数据库中获得几列的更新。 原因是 实体类只有很少的字段而不是属性,并且它们的更新被忽略,就像
class SomeTable
{
public string? Foo;
}
但应该是这样
class SomeTable
{
public string? Foo { get; set; }
}
我的类中有很多属性,所以没有注意到其中很少有字段。
来自ChatGPT
在实体框架 (EF) 中,不会自动检测对实体类字段(而不是属性)的更改,因此不会保存到数据库中。发生这种情况是因为 EF 依赖于更改跟踪,它跟踪对实体类的公共属性所做的修改。默认情况下,EF 中不跟踪字段(即没有属性的变量)。 ...
字段的跟踪方式不同。 EF 不会检测字段更改,因为它们绕过了自动更改跟踪机制。