Entity Framework 自动在父 table 中插入新行
Entity Framework automatically inserts new row in parent table
我正在使用 UI 将数据插入数据库。这是我的实体模型和控制器。每当我将数据插入 UserDetail
table 时,它会自动在 UserRole
table 中创建一个新行。不知道为什么会这样。目前 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; }
}
在实例化 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);
我正在使用 UI 将数据插入数据库。这是我的实体模型和控制器。每当我将数据插入 UserDetail
table 时,它会自动在 UserRole
table 中创建一个新行。不知道为什么会这样。目前 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; }
}
在实例化 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);