У меня есть контроллер API для написания новых пользователей в базу данных, которая выглядит следующим образом:Entity Framework код вопрос дублирования первого пункта
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
правильно вставлена с соответствующими идентификаторами типа пользователя и область, но строки, которые должны быть вставлены в моей DBO .UserRoles и dbo.UserRetailers не вставлены, что означает, что связь между пользователем и ролью/розничными продавцами, которые я ему назначил, потеряна.
Из моего исследования StackOverflow кажется, что объекты Area и User Type, которые я извлекаю из базы данных, отделяются от контекста, поэтому обновление создает новые объекты, которые имеют похожие свойства с теми, которые я выбрал, но (очевидно) с другим Id. Тем не менее, я все еще не уверен, как исправить эту проблему.
Я не смотрел код, но из вашего описания проблемы кажется, что вы знаете, что вам нужно прикрепить объект к DbContext. Вот как вы можете это сделать: http://stackoverflow.com/a/29721938/1864167 Если это решает вашу проблему, дайте мне знать. –