我有以下课程:
public class User
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string Email { get; set; }
[Required]
public virtual Role Role { get; set; }
}
public class Role
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RoleId { get; set; }
[Required]
public string RoleName { get; set; }
}
我想插入一个新用户:
var user = new User()
{
Email = "jhon@gmail.com",
Role = ?
};
db.Users.Add(user);
db.SaveChanges();
如何将RoleId=1
插入为FK
?
答案 0 :(得分:2)
我注意到的一件事是用户类缺少RoleId导航属性。
如果您不介意向您的User类添加导航属性,则可以进行以下更改以实现它。
public class User
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string Email { get; set; }
public int RoleId {get;set;}
[Required]
public virtual Role Role { get; set; }
}
现在您可以像这样插入用户:
var user = new User()
{
Email = "jhon@gmail.com",
RoleId = db.Roles.Single(r => r.RoleName = "Role_Name").Select(x=>x.RoleId)
};
db.Users.Add(user);
db.SaveChanges();
答案 1 :(得分:0)
如果是新角色,则可以为该用户创建特殊的新角色,例如:
var role = new Role{
RoleName = "Whatever"
}
var user = new User(){
Email = "jhon@gmail.com",
Role = role
}
db.Users.Add(user);
db.SaveChanges();
如果它是现有角色,并且您没有导航属性,则最好从db中获取角色以具有db实体:
var role = db.Roles.Single(x => x.RoleName == "Whatever");
var user = new User(){
Email = "jhon@gmail.com",
Role = role
}
db.Users.Add(user);
db.SaveChanges();
答案 2 :(得分:0)
Identity
选项指定仅在将值首次添加到数据库时才由数据库生成该值。此后,实体框架将不会将该属性包含在UPDATE
语句中。
最后,您不需要设置RoleId
,只需使用RoleName
创建对象并将其添加到数据库中即可。