Cascade.SaveOrUpdate (SQLite) fluent-nhibernate

У меня отношения "многие ко многим" между двумя классами: турнир и игроки.

Я установил Cascade.SaveUpdate в сопоставлениях, но при сохранении экземпляра Tournament игроки не будут сохраняться в таблице Players. Nhibernate записывает только родительские и дочерние ключевые столбцы в связывающую таблицу. БД - это SQLite.

Это сопоставления

 public TournamentMap()
    {
        WithTable("Tournaments");
        Id(x => x.Name);
        Map(x => x.Start).Access.AsLowerCaseField();
        Map(x => x.End).Access.AsLowerCaseField();

        HasManyToMany<Player>(x => x.Players)
            .WithTableName("TournamentsPlayers")
            .WithParentKeyColumn("tournamentName")
            .WithChildKeyColumn("playerName").AsSet()
            .Access.AsLowerCaseField()
            .Cascade.SaveUpdate().LazyLoad();

        References(x => x.Type).Access.AsLowerCaseField()
            .TheColumnNameIs("typeName")
            .Cascade.SaveUpdate();
    }

  public class PlayerMap : ClassMap<Player>
{
    public PlayerMap()
    {
        WithTable("Players");
        Id(x => x.Name);

        HasManyToMany<Player>(x => x.Tournaments)
            .Access.AsLowerCaseField()
            .WithTableName("TournamentsPlayers")
            .WithParentKeyColumn("playerName")
            .WithChildKeyColumn("tournamentName").AsSet()
            .Cascade.SaveUpdate().IsInverse().LazyLoad();
    }
}

Пожалуйста, покажите код, который вы используете для сохранения игроков и турнира в базе данных

sirrocco 11.01.2009 15:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
2 774
2

Ответы 2

Может быть, немного (или сильно) поздно, но тем не менее,

Я упростил ваш пример, чтобы он выглядел так:

public class Tournament
{
    public virtual Guid Id { get; private set; }

    private readonly ISet<Player> players;

    public Tournament()
    {
        players = new HashedSet<Player>();
    }

    public virtual ISet<Player> Players
    {
        get { return players; }
    }

    public virtual void AddPlayer(Player player)
    {
        players.Add(player);
    }
}

public class Player 
{
    public virtual Guid Id { get; private set; }

    private readonly ISet<Tournament> tournaments;

    public Player()
    {
        tournaments = new HashedSet<Tournament>();
    }

    public virtual ISet<Tournament> Tournaments
    {
        get { return tournaments; }
    }

    public virtual void AddTournament(Tournament tournament)
    {
        tournaments.Add(tournament);
    }
}

public class TournamentMap : ClassMap<Tournament>
{
    public TournamentMap()
    {
        Id(x => x.Id).GeneratedBy.GuidComb();

        HasManyToMany<Player>(x => x.Players)
            .AsSet().Access.AsLowerCaseField()
            .Cascade.SaveUpdate();
    }
}
public class PlayerMap : ClassMap<Player>
{
    public PlayerMap()
    {
        Id(x => x.Id).GeneratedBy.GuidComb();

        HasManyToMany<Tournament>(x => x.Tournaments)
            .Access.AsLowerCaseField()
            .AsSet()
            .Cascade.SaveUpdate().Inverse();
    }
}

Первый тест выглядит так:

   [Test]
    public void CanSavePlayerAttachedToTournament()
    {
        Player player = new Player();
        Tournament tournament = new Tournament();
        player.AddTournament(tournament);
        tournament.AddPlayer(player);
        Session.Save(tournament);
        Session.Flush();
    }

и дает следующий sql:

NHibernate: ВСТАВИТЬ В "Турнирные" (Id) ЗНАЧЕНИЯ (@ p0); @ p0 = '65559bba-8603-4874-8a8f-9bf4018596df' NHibernate: ВСТАВИТЬ В "Player" (Id) VALUES (@ p0); @ p0 = '549e107c-1339-4fab-8960-9bf4018596e8' NHibernate: ВСТАВИТЬ В PlayerToTournament (Tournament_id, Player_id) VALUES (@ p0, @ p1); @ p0 = '65559bba-8603-4874-8a8f-9bf4018596df', @ p1 = '549e107c-1339-4fab-8960-9bf4018596e8'

Второй тест выглядит так:

    [Test]
    public void CanSaveTounamentAttachedToPlayer()
    {
        Player player = new Player();
        Tournament tournament = new Tournament();
        player.AddTournament(tournament);
        tournament.AddPlayer(player);
        Session.Save(player);
        Session.Flush();
    }

и дает следующий sql:

NHibernate: ВСТАВИТЬ В "Player" (Id) VALUES (@ p0); @ p0 = '35c078c5-1102-4c63-91ca-9bf40185971c' NHibernate: ВСТАВИТЬ В "Турнирные" (Id) ЗНАЧЕНИЯ (@ p0); @ p0 = '367898cf-5835-4e1b-9d7d-9bf40185971c' NHibernate: ВСТАВИТЬ В PlayerToTournament (Tournament_id, Player_id) VALUES (@ p0, @ p1); @ p0 = '367898cf-5835-4e1b-9d7d-9bf40185971c', @ p1 = '35c078c5-1102-4c63-91ca-9bf40185971c'

ВСЕГДА сохраняйте транзакцию.

Ваше здоровье

Другие вопросы по теме