Удаление отношения многие ко многим приводит к запросам на удаление и вставку - PullRequest
2 голосов
/ 12 августа 2010

У меня есть сущность под названием «Стратегия», а другая - «Команда».Оба сопоставляются с использованием отношения «многие ко многим»:

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.

Если это может помочь, я получил их от здесь .

Я пытался изменить значение каскадирования с обеих сторон, но все еще не мог 'что-то работает: '(

Кто-нибудь может помочь?Или это нормальное поведение?Но это было бы странно ...

Заранее спасибо

Майк

1 Ответ

3 голосов
/ 12 августа 2010

Я полагаю, что вам потребуется сопоставить коллекции как <set> вместо <bag>, чтобы получить функциональность, к которой вы стремитесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...