NHibernate-如何从多对多关系中删除项目
本文关键字:关系 删除项目 NHibernate- | 更新日期: 2023-09-27 18:24:57
以下是两个表的映射,这两个表之间存在多对多关系。如何从映射表中删除条目,在我的情况下是"ProjectUser"?
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:按照答案中的建议,将Cascade更改为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);
}
每当我尝试保存/更新时,我都会收到以下错误:
具有相同标识符值的另一个对象已与实体Models的会话10关联。Project
第2版:应使用会话。SaveOrUpdate(项目)和会话。Flush()以避免上述错误。
如果只想删除ProjectUser条目,而不想实际删除另一端的实体,则需要从Cascade.All()
更改为Cascade.SaveUpdate()
。
目前,如果从项目中删除用户并保存该项目,则会删除ProjectUser
条目和User
对象。
我的猜测是从Project.Users集合中删除相应的User实体并保存该项目。级联将删除"ProjectUser"中的条目。
如果你想删除Project和User之间的链接(这意味着从联接表ProjectUser中删除记录),你应该从非相反的方面采取行动。在你的情况下,这意味着你应该从项目的用户集合中删除用户实体:
project.Users.Remove(user);
在我看来,多对多关联中的级联应该设置为SaveUpdate。删除用户后,您不希望删除该项目。