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>地圖讓你以後的功能。