简体   繁体   English

实体框架插入FK

[英]Entity Framework insert FK

I have the following classes: 我有以下课程:

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; }        
}

I would like to insert a new User: 我想插入一个新用户:

var user = new User()
{
   Email = "jhon@gmail.com",                    
   Role = ?
 };


 db.Users.Add(user);
 db.SaveChanges();

How do I insert the RoleId=1 as an FK ? 如何将RoleId=1插入为FK

One thing I noticed is that the User Class is missing the RoleId navigation property. 我注意到的一件事是用户类缺少RoleId导航属性。

If you don't mind adding navigation property to your User class, you can make below changes to achieve it. 如果您不介意将导航属性添加到您的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; }
    }

And now you can insert the User like this: 现在您可以像这样插入用户:

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();

If it is a new role you would create special new role for that user like: 如果是新角色,则可以为该用户创建特殊的新角色,例如:

var role = new Role{
  RoleName = "Whatever"
} 

var user = new User(){
  Email = "jhon@gmail.com",
  Role = role
}
db.Users.Add(user);
db.SaveChanges();

If it is existing role and as you don't have navigation property would be best to fetch role from db to have db entity: 如果它是现有角色并且没有导航属性,则最好从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();

The Identity option specifies that the value will only be generated by the database when a value is first added to the database. Identity选项指定仅在将值首次添加到数据库时才由数据库生成该值。 Thereafter, the property will not be included in UPDATE statements by Entity Framework. 此后,该实体框架将不会将该属性包括在UPDATE语句中。

To conclude, you don't need to set RoleId , just create object with RoleName and add it to database. 总之,您无需设置RoleId ,只需使用RoleName创建对象并将其添加到数据库即可。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM