2

我有一个名为Strategy的实体,另一个名为Team。删除多对多关系会导致删除和插入查询

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"); 
    } 
} 

这里是单元测试产生从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()); 
    } 
} 

以下是查询上届会议NH产生两者都使用许多一对多的关系映射.Flush():

NHibernate的:DELETE FROM TeamStrategies WHERE TEAM_ID = @ P0; P0 @ = 1 [类型:的Int32(0)]

NHib ernate:INSERT INTO TeamStrategies(TEAM_ID,Strategy_id)VALUES(@ P0,@ P1); @ P0 = 1 [类型:的Int32(0)],@ P1 = 2 [类型:的Int32(0)]

为什么NH删除所有TeamStrategies的行,然后插入那些未被删除的行?

我该如何使它在包含TeamId和StrategyId过滤器的WHERE子句中执行单个DELETE?

我读过,虽然在Google上搜索我的问题,这可能与Equals和GetHashCode函数有关。

如果它可以帮助,我从here得到它们。

我试图改变级联的值,两侧,但我还是没能有一些工作:'(

谁能帮助或者,也许这是正常的行为,但是这?将奇...

在此先感谢

迈克

+0

[更新Nhibernate中的多对多集合导致连接表中多次删除]的可能重复(http://stackoverflow.com/questions/3330177/update-of-many-to-many-collection-in -nhibernate-causes-multiple-deletes-in-join) – 2010-08-12 19:27:25

+0

是的。我之前搜索过,但看不到这个答案。 谢谢! 无论如何我应该删除这个问题吗? – Mike 2010-08-12 20:48:08

回答

3

我相信你将需要集合作为<set>而不是<bag>地图让你以后的功能。