У меня есть сущность под названием «Стратегия», а другая - «Команда».Оба сопоставляются с использованием отношения «многие ко многим»:
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: УДАЛИТЬ ИЗ TeamStrategies WHERE Team_id = @ p0; @ p0 = 1 [Тип: Int32 (0)]
NHibernate: INSERTINTO TeamStrategies (Team_id, Strategy_id) ЗНАЧЕНИЯ (@ p0, @ p1); @ p0 = 1 [Тип: Int32 (0)], @ p1 = 2 [Тип: Int32 (0)]
Почему NH удаляет все строки TeamStrategies, прежде чем вставлять те, которые не были удалены?
Как я могу заставить его выполнить одно DELETE с предложением WHERE, содержащим фильтр как для TeamId, так и для StrategyId?
Я читал, когда гуглял о моей проблеме, что это может быть связано с функциями Equals и GetHashCode.
Если это может помочь, я получил их от здесь .
Я пытался изменить значение каскадирования с обеих сторон, но все еще не мог 'что-то работает: '(
Кто-нибудь может помочь?Или это нормальное поведение?Но это было бы странно ...
Заранее спасибо
Майк