2009-01-10 6 views
1

J'ai plusieurs à plusieurs entre deux classes: Tournoi et joueursCascade.SaveOrUpdate (SQLite)-de Fluent NHibernate

Je Cascade.SaveUpdate ensemble dans les applications, mais lors de l'enregistrement d'une instance du tournoi, les joueurs ne sera pas enregistré dans la table Players. Nhibernate écrit uniquement les colonnes de clé parent et enfant dans la table de liaison. La base de données est SQLite.

Ce sont les correspondances

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(); 
    } 
} 
+0

Veuillez montrer le code que vous utilisez pour enregistrer les joueurs et le tournoi dans la base de données – sirrocco

Répondre

5

Peut-être un peu (ou beaucoup) en retard, mais néanmoins,

J'ai simplifié votre exemple pour ressembler à ceci:

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(); 
    } 
} 

Le premier le test ressemble à:

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

et donne le code SQL suivant:

NHibernate: INSERT INTO "Tournament" (Id) VALUES (@ p0); @ p0 = '65559bba-8603-4874-8a8f-9bf4018596df' NHibernate: INSERT INTO Valeurs "Player" (Id) (@ p0); @ p0 = '549e107c-1339-4fab-8960-9bf4018596e8' NHibernate: INSCRIRE DANS PlayerToTournament (Tournament_id, Player_id) VALUES (@ p0, @ p1); @ P0 = '65559bba-8603-4874-8a8f-9bf4018596df', @ p1 = '549e107c-1339-4fab-8960-9bf4018596e8'

Le second test ressemble:

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

et donne les éléments suivants sql:

NHibernate: INSERT INTO VALEURS "Player" (Id) (@ p0); @ p0 = '35c078c5-1102-4c63-91ca-9bf40185971c' NHibernate: INSERT INTO Valeurs de "Tournament" (Id) (@ p0); @ p0 = '367898cf-5835-4e1b-9d7d-9bf40185971c' NHibernate: INSCRIRE DANS PlayerToTournament (Tournament_id, Player_id) VALUES (@ p0, @ p1); @ p0 = '367898cf-5835-4e1b-9d7d-9bf40185971c', @ p1 = '35c078c5-1102-4c63-91ca-9bf40185971c'

-2

TOUJOURS faire votre sauvegarde dans une transaction.

Cheers