我有一個名爲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得到它們。
我試圖改變級聯的值,兩側,但我還是沒能有一些工作:'(
誰能幫助或者,也許這是正常的行爲,但是這?將奇...
在此先感謝
邁克
[更新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
是的。我之前搜索過,但看不到這個答案。 謝謝! 無論如何我應該刪除這個問題嗎? – Mike 2010-08-12 20:48:08