2013-01-01 79 views
0

我在用戶和角色之間有多對多的關係。它們的設置如下:代碼首先多對多:如何將一個集合添加到對象中

public partial class User 
    { 
     //public User() 
     //{ 
     // //this.DateCreated = DateTime.Now; //set default value 
     // Roles = new HashSet<Role>(); 
     //} 

     public ICollection<Role> Roles { get; set; } //many to many relationship 

     public int UserId { get; set; } 
     public string FirstName { get; set; } 
     public string Surname { get; set; } 
     public string Username { get; set; } 
     public string Password { get; set; } 
     public string City { get; set; } 

     //foreign key 
     public int CountryId { get; set; } 
     //navigation properties 
     public virtual Country Country { get; set; } 

     //foreign key 
     public int LanguageId { get; set; } 
     //navigation properties 
     public virtual Language Language { get; set; } 

     public string EmailAddress { get; set; } 
     public long? FacebookId { get; set; } 
     public DateTime DateCreated { get; set; } 
    } 

public partial class Role 
    { 
     //public Role() 
     //{ 
     // Users = new HashSet<User>(); 
     //} 

     public ICollection<User> Users { get; set; } //many to many relationship 

     public int RoleId { get; set; } 
     public string RoleName { get; set; } 
    } 

//many to many relationship 
      modelBuilder.Entity<User>(). 
       HasMany(c => c.Roles). 
       WithMany(p => p.Users). 
       Map(
       m => 
       { 
        m.MapLeftKey("UserId"); 
        m.MapRightKey("RoleId"); 
        m.ToTable("UserRoles", schemaName: "Main"); 
       }); 

在我添加新用戶的代碼中,我希望能夠爲該用戶添加角色。但是每當我這樣做時,新的角色也被添加到角色表中。什麼是正確的方法來做到這一點?

[HttpPost] 
     public ActionResult UserAdd(UserDTO user) 
     { 
      if (ModelState.IsValid) 
      { 
       //do mapping manually here 
       Country country = _repository.GetCountryByCountryId(user.CountryId); 
       Language language = _repository.GetLanguageByLanguageId(user.LanguageId); 

       User entity = new User(); 
       entity.FirstName = user.FirstName; 
       entity.Surname = user.Surname; 
       entity.Username = user.Username; 
       entity.Password = user.Password; 
       entity.City = user.City; 
       entity.CountryId = country.CountryId; 
       entity.LanguageId = language.LanguageId; 
       entity.Country = country; 
       entity.Language = language; 
       entity.EmailAddress = user.EmailAddress; 
       entity.FacebookId = null; 
       entity.DateCreated = DateTime.Now; 
       entity.Roles = new List<Role>(); 

       foreach (int i in user.Roles) 
       { 
        Role role = _repository.GetRoleByRoleId(i); 
        entity.Roles.Add(new Role { RoleId = i, RoleName = role.RoleName }); 
       } 

       int newUserId = _repository.AddUser(entity); 

       return View(); 
      } } 

回答

0
entity.Roles.Add(new Role { RoleId = i, RoleName = role.RoleName }); 

這是問題所在,因爲你創建新實例,它意味着絕對的新角色。您必須從您的上下文中與角色一起工作:

foreach (int i in user.Roles) 
      { 
       Role role = _repository.GetRoleByRoleId(i); 
       entity.Roles.Add(role); // don't create new instance here! 
      } 
相關問題