我有一个名为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