3

私は多対多の関係を持つ2つのテーブルのマッピングに従ってきました。私の場合、「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

この問題は修正されました。追加する必要があるのは、別のプロジェクトユーザーを削除して追加する前に保存してフラッシュすることだけでした。 – Raj

0

私の推測では、適切なUserエンティティをProject.Usersコレクションから削除し、そのプロジェクトを保存することです。カスケードは「ProjectUser」のエントリを削除します。

0

プロジェクトとユーザの間のリンクを削除する場合(つまり、結合テーブルProjectUserからレコードを削除することを意味します)、あなたは宇宙側から行動する必要があります。

project.Users.Remove(user); 

私の意見のカスケードでは、多対多の連想で:あなたのケースでは、それはあなたがプロジェクトのユーザーコレクションからユーザエンティティを削除するべきであることを意味します。 SaveUpdateに設定する必要があります。ユーザーが削除されたときにプロジェクトを削除する必要はありません。

関連する問題