首页 > 解决方案 > 实体框架自动在父表中插入新行

问题描述

我正在使用 UI 将数据插入数据库。这是我的实体模型和控制器。每当我向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; }

    }

标签: c#entity-frameworkdependency-injectionunit-of-work

解决方案


在实例化 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()

然后,您将用户添加到 _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);

推荐阅读