3

У меня есть следующее сопоставление для двух таблиц, имеющих отношения «Много-ко-многим» между ними. Как удалить запись из таблицы сопоставления, которая является «ProjectUser» в моем случае?NHibernate - как удалить элемент из отношений «многие ко многим»?

public ProjectMap() 
{ 
    Id(x => x.Id); 
    Map(x => x.ProjectName); 
    Map(x => x.Description); 
    References<User>(x => x.Owner); 
    HasManyToMany(x => x.Users) 
     .Cascade.SaveUpdate() 
     .Table("ProjectUser") 
     .Not.LazyLoad(); 
} 


public UserMap() 
{ 
    Id(x => x.Id); 
    Map(x => x.FirstName); 
    Map(x => x.LastName); 
    Map(x => x.UserName); 
    HasManyToMany(x => x.Projects) 
     .Cascade.SaveUpdate() 
     .Inverse() 
     .Table("ProjectUser") 
     .Not.LazyLoad(); 
} 

EDIT: изменен Каскад в SaveUpdate, как предложено в ответах. Вот код, который я использую для передачи данных в базу данных SQLite.

using (var trans = session.BeginTransaction()) 
{ 
    var existingUsers = project.Users.ToList(); 
    foreach (var item in existingUsers) 
    { 
     if (selectedUsers.Count(x => x.Id == item.Id) == 0) 
      project.Users.RemoveAt(project.Users.IndexOf(item)); 
    } 
    session.SaveOrUpdate(project); // This fixed the issue 
    session.Flush(); 
    foreach (var item in selectedUsers) 
    { 
     if (project.Users.Count(x => x.Id == item.Id) == 0) 
     { 
      project.AddUser(session.Get<User>(item.Id)); 
     } 
    } 
    session.SaveOrUpdate(project); 
    session.Flush(); 
    trans.Commit(); 
} 

// Add user code in Project class 
public virtual void AddUser(User userToAdd) 
{ 
    if (this.Users == null) 
     this.Users = new List<User>(); 
    userToAdd.Projects.Add(this); 
    this.Users.Add(userToAdd); 
} 

Всякий раз, когда я пытаюсь сохранить/обновить Я получаю следующее сообщение об ошибке:

a different object with the same identifier value was already associated with the session: 10, of entity: Models.Project

EDIT2: Следует использовать Session.saveOrUpdate (проект) и session.Flush(), чтобы избежать ошибок было указано выше ,

ответ

6

Если вы хотите удалить запись ProjectUser и фактически не удалить объект с другой стороны, вам необходимо изменить с Cascade.All() на Cascade.SaveUpdate().

В настоящее время, если вы удалили пользователя из проекта и сохранили проект, он удалит запись ProjectUser и объект User.

+1

Это устранило проблему, и все, что мне нужно сделать, это сохранить и сфотографировать, прежде чем я удалю и добавлю еще один projectUser. – Raj

0

Мое предположение заключается в удалении соответствующего объекта User из коллекции Project.Users и сохранения этого проекта. Затем каскад удалит запись в «ProjectUser».

0

Если вы хотите удалить ссылку между проектом и пользователем (это означает удаление записи из таблицы соединений ProjectUser), вы должны действовать с непеременной стороны. В вашем случае это означает, что вы должны удалить пользователя объект из коллекции пользователями проекта:

project.Users.Remove(user); 

На мой взгляд каскада во многих ко многим доц. должен быть установлен в SaveUpdate. Вы не хотите удалять проект при удалении пользователя.