【发布时间】:2019-02-11 23:10:06
【问题描述】:
我有一个这样的模型:
public class UserIdentity : IdentityUser
{
public User User { get; set; }
}
public class User : Entity
{
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public DateTime DateOfBirth { get; set; }
public Occupation Occupation { get; set; }
public Country Country { get; set; }
public City City { get; set; }
public Ethnicity Ethnicity { get; set; }
public GenderEnum Gender { get; set; }
}
IdentityUser 位于 AspNetCore.Identity 命名空间中。另外,我将Urf.Core 用于我的存储库和服务层,而实体用于在该库中指定可跟踪的实体。
在我的应用层中,我有一个注册用户的服务,我使用UserManager<UserIdentity> 来保存用户。
public async Task Register(UserRegistrationDto dto)
{
var newUser = new User();
var country = GetCountry(dto.CountryName);
var city = GetCity(country, dto.CityName, dto.CityId.Value);
var ethnicity = GetEthnicity(dto.EthnicityId.Value);
var occupation = GetOccupation(dto.OccupationId.Value);
newUser.Country = country;
newUser.City = city;
newUser.Occupation = occupation;
newUser.Ethnicity = ethnicity;
newUser.DateOfBirth = dto.DateOfBirth;
newUser.Name = dto.Name;
newUser.Surname = dto.Surname;
newUser.Gender = (GenderEnum)dto.Gender.Value;
_userService.Insert(newUser);
var newIdentity = new UserIdentity {UserName = dto.Email, Email = dto.Email, User = newUser};
var result = await _userManager.CreateAsync(newIdentity, dto.Password);
//await _unitOfWork.SaveChangesAsync();
}
代码说明:
GetCountry 和 GetCity 都检查城市和国家是否存在,如果不存在,则创建它们。我在_userService.Insert(newUser) 中插入用户及其与Urf 服务的所有关系,并再次将其保存在单个事务中,Urf 工作单元await _unitOfWork.SaveChangesAsync()
问题:
将SaveChangesAsync() 放在_userManager.CreateAsync() 之前,可以毫无问题地创建用户、城市、国家和所有内容。但是,如果我调用 _userManager.CreateAsync(),则 ef 会为国家、城市和用户表中的 id 列抛出异常 'Cannot insert explicit value for identity column...'。
我想在SaveChanges() 的一次调用中保存UserIdentity 和其余关系,但看起来_userManager.CreateAsync() 无法像_unitOfWork.SaveChangesAsync() 那样保存关系。
临时解决方案:
为了暂时通过,我颠倒了UserIdentity 和User 中的关系,我首先创建身份,如果成功,我插入其余的:
public async Task Register(UserRegistrationDto dto)
{
var newIdentity = UserIdentity.CreateIdentity(dto.Email, dto.Email, dto.Phone);
var result = await _userManager.CreateAsync(newIdentity, dto.Password);
if (result.Succeeded)
{
var newUser = new User();
var country = GetCountry(dto.CountryName);
var city = GetCity(country, dto.CityName, dto.CityId.Value);
var ethnicity = GetEthnicity(dto.EthnicityId.Value);
var occupation = GetOccupation(dto.OccupationId.Value);
newUser.Identity = newIdentity;
newUser.Country = country;
newUser.City = city;
newUser.Occupation = occupation;
newUser.Ethnicity = ethnicity;
newUser.DateOfBirth = dto.DateOfBirth;
newUser.Name = dto.Name;
newUser.Surname = dto.Surname;
newUser.Gender = (GenderEnum)dto.Gender.Value;
_userService.Insert(newUser);
await _unitOfWork.SaveChangesAsync();
}
}
但正如您所见,它将它们保存在两个单独的事务中,如果 _unitOfWork.SaveChangesAsync(); 因任何原因失败,则创建身份并且我无法回滚(可能但很脏)
有人知道为什么会出现我解释的问题吗?
【问题讨论】:
标签: c# asp.net-core entity-framework-core