2012-05-30 34 views
2

我無法弄清楚爲什麼這不起作用.. 我有兩個實體之間有多對多的關係。流利Nhibernate ManyToMany關係 - 不保存協會

public class User : BaseEntity 
    { 
     public User() 
     { 
      Roles = new List<Role>(); 
     } 

     [DisplayName("UserName")] 
     [Required] 
     [StringLength(20, MinimumLength = 5)] 
     public virtual string UserName { get; set; } 

     [DisplayName("Password")] 
     [Required] 
     [DataType(DataType.Password)] 
     public virtual string Password { get; set; } 

     [DisplayName("Email Address")] 
     [Required] 
     [DataType(DataType.EmailAddress)] 
     public virtual string Email { get; set; } 

     public virtual IList<Role> Roles { get; set; } 
    } 


    public class Role : BaseEntity 
    { 
      public Role() 
      { 
       Users=new List<User>(); 
      } 


     [Required] 
     [DisplayName("Role Name")] 
     public virtual string RoleName { get; set; } 


     public virtual string Description { get; set; } 

     public virtual IList<User> Users { get; set; } 
    } 

    public class UserMapping : ClassMap<User> 
    { 
     public UserMapping() 
     { 
      Id(x => x.Id); 

      Map(x => x.UserName).Not.Nullable().Unique(); 
      Map(x => x.Password).Not.Nullable(); 
      Map(x => x.Email).Not.Nullable().Unique(); 
      Map(x => x.DateCreated); 
      Map(x => x.DateModified); 
      HasManyToMany<Role>(mi => mi.Roles) 
    .Table("UsersRoles").ParentKeyColumn("UserId").ChildKeyColumn("RoleId") 

    .Cascade.SaveUpdate().Inverse(); 


     } 
    } 

    public class RoleMapping : ClassMap<Role> 
    { 
     public RoleMapping() 
     { 
      Id(x => x.Id); 
      Map(x => x.RoleName).Not.Nullable().Unique(); 

      Map(x => x.Description).Nullable(); 
      Map(x => x.DateCreated); 
      Map(x => x.DateModified); 


     } 


    } 

當我保存協會盡量簡單不保存:

var role = _roleTask.GetItem(1); // I am sure exist. 
    var user = _userTask.GetItem(1); // I am sure exist. 

    user.Roles.Add(role); 
    userTask.UpdateItem(user); 

誰能告訴我什麼是映射這讓NHibernate的實際存儲關聯的正確方法?
我使用SQLite

+0

什麼'''userTask任務無碼.UpdateItem(用戶);'''呢? – ungood

+0

@ungood它更新實體!我相信他們運作良好。 – Shahin

+0

你確定它不工作?在刷新會話之前,關聯不會被保留。 – Vadim

回答

5

,因爲對於我發佈的信息應該工作

// UserMap 
HasManyToMany(x => x.Roles) 
    .Table("sometable") 
    .ParentKeyColumn("User_id") 
    .ChildKeyColumn("Role_id"); 

// RoleMap 
HasManyToMany(x => x.Users) 
    .Table("sometable") 
    .ParentKeyColumn("Role_id") 
    .ChildKeyColumn("User_id") 
    .Inverse(); // User handels the insert in the link table 

var user = session.Get<User>(1); 
var role = session.Get<Role>(1); 

user.Roles.Add(role); 
role.Users.Add(user); // not nessessary for NH because inverse is set but good to be consistent 

// Flush all changes (in particular the collection changes) to db 
session.Flush();