C# 实体框架插入FK

C# 实体框架插入FK,c#,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 {

我有以下课程:

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
插入?

如果是新角色,您将为该用户创建特殊的新角色,如:

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

如果是新角色,您将为该用户创建特殊的新角色,如:

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

Identity
选项指定仅当值首次添加到数据库时,数据库才会生成该值。此后,该属性将不包括在实体框架的
UPDATE
语句中


总之,您不需要设置
RoleId
,只需使用
RoleName
创建对象并将其添加到数据库。

标识选项指定仅当值首次添加到数据库时,数据库才会生成值。此后,该属性将不包括在实体框架的
UPDATE
语句中


总之,您不需要设置
RoleId
,只需使用
RoleName
创建对象并将其添加到数据库中即可。

我注意到,用户类缺少RoleId导航属性

如果您不介意将导航属性添加到您的用户类中,您可以进行以下更改来实现它

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

我注意到的一点是,User类缺少RoleId导航属性

如果您不介意将导航属性添加到您的用户类中,您可以进行以下更改来实现它

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

您是否尝试过使用
[ForeignKey]
属性?您是否尝试过使用
[ForeignKey]
属性?在我的例子中,EF自动在Users表中将RoleId(“角色Id”)创建为FK。在用户类对象中添加RoleId使其更加简单。现在,我可以通过写入roleId=1来添加用户roleId。在我的情况下,EF会自动在Users表中将roleId('Role_Id')创建为FK。在用户类对象中添加RoleId使其更加简单。现在我可以通过编写roleId=1来添加用户roleId