Fluid NHibernate Many to Many insert problème

J'ai UserModel et RoleModel. Je pense que les users peuvent avoir plus d'un rôle et un rôle peut avoir plus d'un user. Je le fais Beaucoup pour beaucoup mais quand j'essaye d'insert un user j'obtiens l'erreur comme:

La command INSERT FOREIGN KEY contrainte "FK6209393F7EB4E792" a coïncidé avec. "projectcoderwho" database "dbo.roles" colonne 'Id' Il y avait un chevauchement dans la table. La déclaration a été résiliée.

Je cherche un peu mais rien d'utile pour moi ou je ne peux pas voir les quelque chose. Quelqu'un a-t-il une idée de mon problème?

Ces codes ont fonctionné seulement une fois. Mais maintenant je reçois l'erreur ci-dessus.

UserModel.cs:

public class UserModel { public virtual int Id { get; set; } public virtual DateTime RegisterDate { get; set; } public virtual ssortingng RegisterIp { get; set; } public virtual ssortingng EMail { get; set; } public virtual ssortingng Password { get; set; } public virtual ssortingng UserName { get; set; } public virtual ssortingng FirstName { get; set; } public virtual ssortingng LastName { get; set; } public virtual ssortingng WebSiteLink { get; set; } public virtual ssortingng FaceBookLink { get; set; } public virtual ssortingng TwitterLink { get; set; } public virtual ssortingng GooglePlusLink { get; set; } public virtual ssortingng PinterestLink { get; set; } public virtual IList<RoleModel> UserRole { get; set; } public virtual DateTime LastLogIn { get; set; } public virtual ssortingng LastLoginIP { get; set; } public virtual ssortingng About { get; set; } public virtual bool IsActive { get; set; } public virtual bool IsFreelancer { get; set; } public virtual bool IsBanned { get; set; } public UserModel() { UserRole = new List<RoleModel>(); } } 

RoleModel.cs

 public class RoleModel { //will contains as default: Admin,Moderator,Author,User public virtual int Id { get; set; } public virtual ssortingng RoleName { get; set; } public virtual IList<UserModel> UsersInRole { get; set; } public RoleModel() { UsersInRole = new List<UserModel>(); } } 

UserModelMap.cs:

 public class UserModelMap : ClassMap<UserModel> { public UserModelMap() { Table("Users"); Id(x => x.Id); Map(x => x.RegisterDate); Map(x => x.RegisterIp); Map(x => x.EMail); Map(x => x.Password); Map(x => x.UserName); Map(x => x.FirstName); Map(x => x.LastName); Map(x => x.WebSiteLink); Map(x => x.FaceBookLink); Map(x => x.TwitterLink); Map(x => x.GooglePlusLink); Map(x => x.PinterestLink); Map(x => x.LastLogIn); Map(x => x.LastLoginIP); Map(x => x.About); Map(x => x.IsActive); Map(x => x.IsFreelancer); Map(x => x.IsBanned); HasManyToMany(x => x.UserRole).Table("UsersRoles") .ParentKeyColumn("RoleId") .ChildKeyColumn("UserId") .LazyLoad() .Cascade.All(); } } 

RoleModelMap.cs:

 public class RoleModelMap : ClassMap<RoleModel> { public RoleModelMap() { Table("Roles"); Id(x => x.Id); Map(x => x.RoleName); HasManyToMany(x => x.UsersInRole).Table("UsersRoles") .ParentKeyColumn("RoleId") .ChildKeyColumn("UserId") .LazyLoad() .Inverse(); } } 

Dans UserApiController.cs:

 [Route("User/Register")] [HttpPost] public ssortingng RegisterUser(object regUser) { RoleModel userRole = BlogModule.getUserRole();//Getting "User" role UserModel newUser = JsonConvert.DeserializeObject<UserModel>(regUser.ToSsortingng()); ssortingng hashedPassword = BlogModule.PasswordToMD5(newUser.Password); newUser.Password = hashedPassword; newUser.RegisterDate = DateTime.Now; newUser.UserRole.Add(userRole); newUser.LastLogIn = DateTime.Now; newUser.LastLoginIP = newUser.RegisterIp; DbOperations.AddNewUserToDatabase(newUser); ssortingng sonuc = "true"; return sonuc; } 

AddNewUserToDatabase (UserModel newUser):

 public static void AddNewUserToDatabase(UserModel newUser) { using (var session = NHibernateHelper.OpenSession()) { using (var transaction = session.BeginTransaction()) { UserModel currentUser = session.QueryOver<UserModel>() .Where(x => x.UserName == newUser.UserName) .SingleOrDefault(); if (currentUser == null) { session.Save(newUser); transaction.Commit(); } } } } 

Le point ici est, que la cartographie HasManyToMany doit être inversée / à l' envers en observant de la perspective de chaque côté. Au lieu de cela:

 public UserModelMap() { ... // here we go wrong - parent column cannot be same HasManyToMany(x => x.UserRole).Table("UsersRoles") .ParentKeyColumn("RoleId") // parent column must target User .ChildKeyColumn("UserId") // not Role ... public RoleModelMap() { ... HasManyToMany(x => x.UsersInRole).Table("UsersRoles") .ParentKeyColumn("RoleId") // parent column must target Role .ChildKeyColumn("UserId") // here is correct ... 

Nous devons donc changer le mappage UserModel de la colonne de la key parente:

 public UserModelMap() { ... // switch them HasManyToMany(x => x.UserRole).Table("UsersRoles") .ParentKeyColumn("UserId") // instead of("RoleId") .ChildKeyColumn("RoleId") // instead of ("UserId") ... public RoleModelMap() { ... // stays unchanged HasManyToMany(x => x.UsersInRole).Table("UsersRoles") .ParentKeyColumn("RoleId") .ChildKeyColumn("UserId") ...