实体框架插入FK

时间:2018-11-06 21:01:25

标签: c#

我有以下课程:

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

3 个答案:

答案 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创建对象并将其添加到数据库中即可。