【发布时间】:2015-12-04 07:34:17
【问题描述】:
我有一个用于将新用户写入数据库的 API 控制器,如下所示:
public abstract class ApiBaseController : ApiController
{
protected UserManager<User, Guid> UserManager { get; set; }
protected dbcontext Repo { get; private set; }
public ApiBaseController()
{
UserManager = HttpContext.Current.GetOwinContext().GetUserManager<XUserManager>();
Repo = HttpContext.Current.GetOwinContext().Get<dbcontext>();
}
}
public class UsersController : ApiBaseController
{
[HttpPost]
[FeatureAuthorization(FeatureName = "Users", Permission = FeaturePermissions.Write)]
public IHttpActionResult Post([FromBody]CreateUserRequest req)
{
if (!ModelState.IsValid)
{
return ResponseMessage(Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.ToApiResponse()));
}
var user = UserManager.FindByName(req.UserName);
//some validation happens here
user = new User()
{
AuthenticationMethod = req.AuthenticationMethod,
DomainLDAP = req.DomainLDAP,
EmailAddress = req.EmailAddress,
FirstName = req.FirstName,
SecondName = req.SecondName,
MentionHandle = req.MentionHandle,
MobileNumber = req.MobileNumber,
UserName = req.UserName,
IsDeleted = false
};
IdentityResult createResult = null;
if (req.AuthenticationMethod == AuthenticationMethod.Internal)
{
createResult = UserManager.Create(user);
}
else
{
createResult = UserManager.Create(user, req.Password);
}
if (!createResult.Succeeded)
{
return ResponseMessage(Request.CreateResponse(HttpStatusCode.BadRequest, new ApiResponse(createResult.Errors.ToArray())));
}
//Map user to user type
user.UserType = Repo.UserTypes.Find(req.UserTypeId);
//Map user to area
user.Area = Repo.Areas.Find(req.AreaId);
//Map user to role
var roles = new List<Role>();
roles.Add(role);
user.Roles = roles;
//Map user to retailers
user.Retailers = retailers;
UserManager.Update(user);
Repo.SaveChanges();
var dto = Mapper.Map<UserDto>(user);
return ResponseMessage(Request.CreateResponse(HttpStatusCode.Created, new ApiResponse<UserDto>(new[] { dto })));
}
}
当我调试此方法并检查 user 对象时
UserManager.Update(user);
它的所有属性设置正确,包括用户类型、区域、角色和零售商的 GUID。但是,在执行该行并检查我的数据库后,已插入的用户对这些属性具有不同的 GUID,并且 EF 已将新行插入到与我的新用户相对应的用户类型和区域表中。
如果我删除执行更新的代码行并离开
Repo.SaveChanges();
行,user 正确插入了适当的用户类型和区域 ID,但是应该插入到我的 dbo.UserRoles 和 dbo.UserRetailers 桥接表中的行没有插入,这意味着用户和我分配给它的角色/零售商丢失了。
从我对 StackOverflow 的研究看来,我从数据库中获取的区域和用户类型对象似乎与上下文分离,因此更新创建了与我获取的对象具有相似属性的新对象,但是(显然) 具有不同的 ID。但是,我仍然不确定如何解决此问题。
【问题讨论】:
-
我没有查看代码,但从您的问题描述看来,您似乎知道必须将对象附加到 DbContext。您可以这样做:stackoverflow.com/a/29721938/1864167 如果这解决了您的问题,请告诉我。
标签: c# sql entity-framework ef-code-first code-first