Bonjour à tous,

J'essaie depuis un petit moment de reprendre le code d'un de mes anciens projets pour découvrir l'ORM. Il s'agit plus ou moins d'un inventaire de jeux. J'ai réussi facilement à ce que cela fonctionne lorsque je ne créais que ma classe "User_360" mais depuis que j'essaie de créer mes classes "User_360" + "Game_360" + "UserGames_360" je tombe sur l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
"An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail."
Je n'arrive pas à la débugger (où est la collection PotentialReasons ? en quoi l'InnerException peut m'aider ?) donc je viens demander de l'aide.

Voici le code pour mes classes.

User_360
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    public class User_360
    {
        public virtual int UserId { get; set; }
        public virtual string GT { get; set; }
        public virtual string Pic { get; set; }
        public virtual int NbGames { get; set; }
        public virtual int NbCheevos { get; set; }
        public virtual int GS { get; set; }
 
        public virtual List<UserGames_360> Plays { get; set; }
 
        public User_360()
        {
            this.UserId = 0;
            this.GT = "";
            this.Pic = "";
            this.NbGames = 0;
            this.NbCheevos = 0;
            this.GS = 0;
            this.Plays = new List<UserGames_360>();
        }
 
            public static User_360 Create(string gamertag)
        {
            User_360 NewUser = new User_360(gamertag);
 
            using (NHibernate.ISession session = NhibernateHelper.OpenSession())
            {
                using (NHibernate.ITransaction transaction = session.BeginTransaction())
                {
                    session.Save(NewUser);
                    transaction.Commit();
                    Console.WriteLine("Created user: " + NewUser.GT + ", id = " + NewUser.UserId);
                }
            }
 
            return (NewUser);
        }
 
 class User_360Map : ClassMap<User_360>
    {
        public User_360Map()
        {
            Table("User_360");
            Id(x => x.UserId).GeneratedBy.Identity(); ;
            Map(x => x.GT).Unique().Not.Nullable();
            Map(x => x.Pic);
            Map(x => x.NbGames);
            Map(x => x.NbCheevos);
            Map(x => x.GS);
            HasMany(x => x.Plays)
                .Cascade.AllDeleteOrphan()
                .Fetch.Join()
                .Inverse().KeyColumn("UserId");
        }
    }
Game_360
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 public class Game_360
    {
        public const int DB_ERROR = -1;
        public const int GAME_NOT_EXISTS = 0;
        public const int GAME_EXISTS = 1;
        public const int GAME_DIFFERENT = 2;
 
        public virtual string GameId { get; set; }
        public virtual string Name { get; set; }
        public virtual int Cheevos { get; set; }
        public virtual int Score { get; set; }
 
        public virtual IList<UserGames_360> Plays { get; set; }
 
        private int exists;
 
        public Game_360()
        {
            this.GameId = "";
            this.Name = "";
            this.Cheevos = 0;
            this.Score = 0;
            this.Exists = GAME_NOT_EXISTS;
        }
UserGames_360
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class UserGames_360
    {
        public virtual int UserGameId { get; set; }
        public virtual DateTime lastscanned { get; set; }
        public virtual Game_360 gameplayed { get; set; }
        public virtual User_360 player { get; set; }
    }
 
    public class UserGames_360Map : ClassMap<UserGames_360>
    {
        public UserGames_360Map()
        {
            Table("plays");
            Id(x => x.UserGameId).GeneratedBy.Identity();
            Map(x => x.lastscanned).Not.Nullable();
            References(x => x.player)
                .Not.Nullable()
                .Cascade.SaveUpdate()
                .Column("userid");
            References(x => x.gameplayed)
                .Not.Nullable()
                .Cascade.SaveUpdate()
                .Column("gameid");
        }
    }
 
class Game_360Map : ClassMap<Game_360>
    {
        public Game_360Map()
        {
            Id(x => x.GameId).GeneratedBy.Identity();
            Map(x => x.Name).Not.Nullable(); ;
            Map(x => x.Cheevos);
            Map(x => x.Score);
            Table("Game_360");
            HasMany(x => x.Plays)
                .Cascade.AllDeleteOrphan()
                .Inverse()
                .Fetch.Join().KeyColumn("GameId");
        }
    }
Mon initialisation NHibernate
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class NhibernateHelper
    {
        private static ISessionFactory _sessionFactory;
 
        private static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    InitializeSessionFactory();
                }
                return _sessionFactory;
            }
        }
 
        private static void InitializeSessionFactory()
        {
            try
            {
                _sessionFactory = Fluently.Configure()
                    .Database(MySQLConfiguration.Standard
                    .ConnectionString(@"Server=localhost;Database=gamingscanner;Uid=scanner;Pwd=a")
                    .ShowSql())
                    .Mappings(m => m.FluentMappings
                        .AddFromAssemblyOf<User_360>())
                    .Mappings(m => m.FluentMappings
                        .AddFromAssemblyOf<Game_360>())
                    .Mappings(m => m.FluentMappings
                        .AddFromAssemblyOf<UserGames_360>())
                    .ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true))
                    .BuildSessionFactory();
            }
            catch (Exception ex)
            {
                System.Console.WriteLine(ex.Message);
                System.Console.ReadLine();
            }
        }
 
        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }
    }
L'appel qui part en exception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
                User_360 NewUser = User_360.Create("MortyDice");
Je suis parti en grande partie du projet suivant : http://www.aaronstannard.com/post/20...y-to-many.aspx

Toutefois, je suis bien conscient que je ne comprends pas comment configurer Fluent NHibernate. J'ai l'habitude de me débrouiller, mais là j'ai un peu quinze onglets d'ouverts sur le sujet et je ne sais plus comment m'en sortir.

Merci d'avance pour toutes vos suggestions !

Edit: J'ai réussi à accéder aux potential reasons (en fait zéro) et à l'inner exception de l'inner exception de l'inner exception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
{"Identity type must be integral (int, long, uint, ulong)"}
Edit 2: Premier souci réglé, je voulais un GameId en string, mais ce n'est pas possible donc passé en int. Les tables sont bien créées, il plante juste après, certainement à l'insertion du premier "User".

=> Nouveau souci, plus obscur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
{"Impossible d'effectuer un cast d'un objet de type 'NHibernate.Collection.Generic.PersistentGenericBag`1[GamingScanner.UserGames_360]' en type 'System.Collections.Generic.List`1[GamingScanner.UserGames_360]'."}
Qu'est-ce qu'un PersistentGenericBag ?

Edit 3: Probable conflit entre les List et les IList. J'ai changé un peu tout ça, et ça a l'air de fonctionner. Je passe le sujet en résolu dès que j'ai confirmé tout ça.