Nhibernate 删除多对多关系会导致删除和插入查询

Nhibernate 删除多对多关系会导致删除和插入查询,nhibernate,fluent-nhibernate,nhibernate-mapping,many-to-many,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Many To Many,我有一个实体叫做战略,另一个实体叫做团队。两者都使用多对多关系进行映射: public class Team : BaseEntity<Team> { private readonly IList<Strategy> allStrategies = new List<Strategy>(); public void AddStrategy(Strategy strategy) { allStrategies.Add(s

我有一个实体叫做战略,另一个实体叫做团队。两者都使用多对多关系进行映射:

public class Team : BaseEntity<Team>
{
    private readonly IList<Strategy> allStrategies = new List<Strategy>();

    public void AddStrategy(Strategy strategy)
    {
        allStrategies.Add(strategy);
        strategy.AddTeam(this);
    }

    public void RemoveStrategy(Strategy strategy)
    {
        allStrategies.Remove(strategy);
        strategy.RemoveTeam(this);
    }
}

public class TeamMap : ClassMap<Team>
{
    public TeamMap()
    {
        HasManyToMany<Strategy>(Reveal.Member<Team>("allStrategies"))
            .Cascade.SaveUpdate()
            .Access.CamelCaseField()
            .Table("TeamStrategies");
    }
}

public class StrategyMap : ClassMap<Strategy>
{
    public StrategyMap()
    {
        HasManyToMany<Team>(Reveal.Member<Strategy>("allTeams"))
            .Inverse()
            .Cascade.SaveUpdate()
            .Access.CamelCaseField()
            .Table("TeamStrategies");
    }
}
公共类团队:BaseEntity
{
private readonly IList allStrategies=new List();
公共战略(战略)
{
添加(策略);
策略。添加团队(本);
}
公共空间再投资战略(战略)
{
所有策略。删除(策略);
策略。移除团队(此);
}
}
公共类TeamMap:ClassMap
{
公共团队地图()
{
HasManyToMany(discover.Member(“allStrategies”))
.Cascade.SaveUpdate()
.Access.CamelCaseField()
.表格(“团队战略”);
}
}
公共类策略图:类地图
{
公共战略地图()
{
HasManyToMany(透露成员(“所有团队”))
.Inverse()
.Cascade.SaveUpdate()
.Access.CamelCaseField()
.表格(“团队战略”);
}
}
下面是单元测试,它从NH产生了一种奇怪的行为:

[Fact]
public void Test()
{
    using (var session = Kernel.Get<ISession>())
    {
        var team = new Team("JAO", Sex.Male);
        var repository = new TeamsRepository(session);
        repository.Save(team);

        var sA1 = new Strategy("Horn", StrategyType.Attack);
        var sA2 = new Strategy("Shirt", StrategyType.Attack);

        session.Save(sA1);
        session.Save(sA2);

        session.Flush();

        team.AddStrategy(sA1);
        team.AddStrategy(sA2);

        repository.SaveOrUpdate(team);

        session.Flush();

        team.RemoveStrategy(sA1);
            
        repository.SaveOrUpdate(team);

        session.Flush();

        Assert.Equal(2, session.Query<Strategy>().Count());
        Assert.Equal(1, session.Query<Team>().Count());
    }
}
[事实]
公开无效测试()
{
使用(var session=Kernel.Get())
{
var团队=新团队(“JAO”,性别,男性);
var存储库=新团队存储库(会话);
保存(团队);
var sA1=新策略(“喇叭”,StrategyType.Attack);
var sA2=新策略(“衬衫”,StrategyType.Attack);
session.Save(sA1);
session.Save(sA2);
session.Flush();
团队战略(sA1);
团队战略(sA2);
repository.SaveOrUpdate(团队);
session.Flush();
团队再投资策略(sA1);
repository.SaveOrUpdate(团队);
session.Flush();
Assert.Equal(2,session.Query().Count());
Assert.Equal(1,session.Query().Count());
}
}
以下是NH在上一次会话中生成的查询。Flush()

NHibernate:从TeamStrategies中删除,其中Team_id=@p0@p0=1[类型:Int32(0)]

NHibernate:插入团队策略(团队id,策略id)值(@p0,@p1)@p0=1[类型:Int32(0)],@p1=2[类型:Int32(0)]

为什么NH在插入那些没有被删除的团队策略之前要删除所有的团队策略行

如何使用WHERE子句在TeamId和StrategyId上都包含一个过滤器来执行单个删除

我在谷歌搜索我的问题时读到,这可能与Equals和GetHashCode函数有关

如果能帮上忙的话,我是从

我试图改变层叠的价值,但我仍然无法让某些东西起作用:'(

有人能帮忙吗?或者这是正常的行为吗?但这会很奇怪

提前谢谢


Mike

我相信您需要将集合映射为
而不是
,以获得您所需的功能。

确实可能是重复的。我以前搜索过,但看不到此答案。谢谢!我还是要删除此问题吗?