NHibernate - 如何从多对多关系中删除项目?

时间:2012-02-16 17:50:47

标签: c# nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我跟踪两个表之间的映射,它们之间具有多对多关系。如何从映射表中删除一个条目,在我的情况下是“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();
}

编辑:按照答案中的建议将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);
}

每当我尝试保存/更新时,我都会收到以下错误:

  

具有相同标识符值的不同对象已与会话关联:10,实体:Models.Project

EDIT2:应使用session.SaveOrUpdate(project)和session.Flush()来避免上述错误。

3 个答案:

答案 0 :(得分:7)

如果您只想删除ProjectUser条目而实际上没有删除另一方的实体,则需要从Cascade.All()更改为Cascade.SaveUpdate()

目前,如果您从项目中删除了用户并保存了项目,则会删除ProjectUser条目和User对象。

答案 1 :(得分:0)

我的猜测是从Project.Users集合中删除相应的User实体并保存该项目。然后级联将删除“ProjectUser”中的条目。

答案 2 :(得分:0)

如果要删除项目和用户之间的链接(这意味着从连接表ProjectUser中删除记录),您应该从非传播方面采取行动。在您的情况下,这意味着您应该从Project的用户集合中删除用户实体:

project.Users.Remove(user);

在我看来,在多对多关联中级联。应设置为SaveUpdate。删除用户时,您不想删除项目。