簡體   English   中英

實體框架插入FK

[英]Entity Framework insert FK

我有以下課程:

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

我注意到的一件事是用戶類缺少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();

如果是新角色,則可以為該用戶創建特殊的新角色,例如:

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創建對象並將其添加到數據庫即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM