c# - 实体框架自动在父表中插入新行
问题描述
我正在使用 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; }
}
解决方案
在实例化 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);
推荐阅读
- javascript - 过滤对象属性为日期的对象数组
- git - Git取消合并(不是最后一次合并)
- angular - 如何在 Angular App 中实现 Hyperledger Composer Rest 服务器的本地护照策略
- php - 在 PHP 中获取重命名的文件名
- ssl - Why does POODLE Attack only affect after downgrading to SSL 3.0?
- html - 如何防止用户代理样式表覆盖我自己的 CSS?
- c - 将位附加到 10 位整数的开头和结尾
- python - Matplotlib 绘图上的名称点
- c# - 为 c# Web API 项目生成站点使用统计信息/分析
- r - R:如何使用代码将“lfstat”包中的“find_droughts”函数图保存为图像?