c# - NHibernate - 如何从多对多关系中删除一个项目?

标签 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);
}

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

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

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

最佳答案

如果您只想删除 ProjectUser 条目而不实际删除另一侧的实体,您需要将 Cascade.All() 更改为 Cascade.SaveUpdate().

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

关于c# - NHibernate - 如何从多对多关系中删除一个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9316394/

相关文章:

c# - 如何在 NHibernate 中选择前 10 名最畅销的产品?

c# - nameof 运算符有什么方法可以访问方法参数(在同一方法之外)?

c# - 如何在 WPF C# 应用程序中动态添加复选框

nhibernate - 为所有域类添加带有接口(interface)的 IAutoMappingOverride

nhibernate - 通过将 linq 与 NHibernate 3.0 结合使用进行分组

nhibernate - nhibernate 日志文件中实体的静态 sql

fluent-nhibernate - 从 Fluent Nhibernate 获取表名

c# - Fluent NHibernate 不会自动映射基类中的一对多属性

c# - 使用 WebGet 的可选 UriTemplate 参数

c# - Web API OWIN 启动异常处理