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