Entity Framework автоматически вставляет новую строку в родительскую таблицу - PullRequest
0 голосов
/ 23 мая 2018

Я использую пользовательский интерфейс для вставки данных в БД.Вот моя модель сущности и контроллер.Всякий раз, когда я вставляю данные в таблицу UserDetail, она автоматически создает новую строку в таблице UserRole.Не уверен, почему это происходит так.На данный момент UserRole жестко задан в контроллере.

public class UserDetail
{
        [Key]
        public int UserID { get; set; }
        [Required]
        [StringLength(30, MinimumLength = 4)]
        public string UserName { get; set; }
        [Required]
        [StringLength(50, MinimumLength = 4)]
        public string FirstName { get; set; }
        [Required]
        [StringLength(50, MinimumLength = 4)]
        public string LastName { get; set; }
        [Required]
        [EmailAddress]
        [StringLength(150, MinimumLength = 4)]
        public string Email { get; set; }
        [Required]
        [DataType(DataType.Password)]
        [StringLength(30,MinimumLength=4)]
        public string Password { get; set; }
        public UserRole UserRole { get; set; }
}

public class UserRole
{
        [Key]
        public int RoleID { get; set; }
        [Required]
        [StringLength(20,MinimumLength=5)]
        public string RoleName { get; set; }
        public IEnumerable<UserDetail> UserDetail { get; set; }
}

[HttpPost]
public HttpResponseMessage Register(UserDetail usrInfo)
{
    UserContext ctx = new UserContext();

    UserDetail user = new UserDetail
            {
                UserRole = ctx.UserRole.Where(id => id.RoleID == 2).Select(r => r).FirstOrDefault(),
                FirstName = usrInfo.FirstName,
                LastName = usrInfo.LastName,
                UserName = usrInfo.UserName,
                Password = usrInfo.Password,
                Email = usrInfo.Email,
            };
    _unitofwork.userDetail.Add(user);

    if (_unitofwork.Completed() > 0)
        return Request.CreateResponse(HttpStatusCode.OK, "Created");
    else
        return Request.CreateResponse();
}
public class UserContext: DbContext
    {
        public UserContext():base()
        {
            Database.SetInitializer<UserContext>(new CreateDatabaseIfNotExists<UserContext>());
            //Database.SetInitializer<UserContext>(new DropCreateDatabaseIfModelChanges<UserContext>());
        }
        public DbSet<UserDetail> UserDetails { get; set; }
        public DbSet<UserRole> UserRole { get; set; }

    }

1 Ответ

0 голосов
/ 23 мая 2018

В операторе, в котором вы создаете экземпляр объекта userdetail, вы используете отдельный контекст для запроса роли пользователя:

UserContext ctx = new UserContext ();

UserDetail user = new UserDetail
        {
            **UserRole = ctx.UserRole.Where(id => id.RoleID == 2).Select(r => r).FirstOrDefault(),**
            FirstName = usrInfo.FirstName,
            LastName = usrInfo.LastName,
            UserName = usrInfo.UserName,
            Password = usrInfo.Password,
            Email = usrInfo.Email,
        };
_unitofwork.userDetail.Add(user);

if (_unitofwork.Completed() > 0)
    return Request.CreateResponse(HttpStatusCode.OK, "Created");
else
    return Request.CreateResponse()

Youзатем добавьте пользователя в коллекцию userdetail в объекте _unitofwork, который имеет собственный контекст.Чтобы выполнить эту работу, полученный вами пользовательский объект должен находиться в том же контексте, в который вы добавляете объект userdetail.

Таким образом, вы, вероятно, хотите что-то вроде:

 UserDetail user = new UserDetail
            {
                UserRole = _unitofwork.UserRole.Where(id => id.RoleID == 2).Select(r => r).FirstOrDefault(),
                FirstName = usrInfo.FirstName,
                LastName = usrInfo.LastName,
                UserName = usrInfo.UserName,
                Password = usrInfo.Password,
                Email = usrInfo.Email,
            };
    _unitofwork.userDetail.Add(user);
...