2010-01-01 3 views
5

I définir une simple classe Bug:Pas de persister pour l'entité

using System; 

namespace BugNS.Entities 
{ 
    class Bug 
    { 
     public virtual int Id { get; private set; } 
     public virtual int BugNumber { get; set; } 
    } 
} 

et une simple classe Mapper:

using System; 
using FluentNHibernate.Mapping; 
using BugNS.Entities; 

namespace BugNS.Mappings 
{ 
    class BugMap : ClassMap<Bug> 
    { 
     public BugMap() 
     { 
      Id(b => b.Id); 
      Map(b => b.BugNumber); 
     } 
    } 
} 

et puis juste essayer de l'utiliser comme:

using System; 
using System.IO; 
using FluentNHibernate.Cfg; 
using FluentNHibernate.Cfg.Db; 
using NHibernate; 
using NHibernate.Cfg; 
using NHibernate.Tool.hbm2ddl; 
using BugNS.Entities; 

namespace BugNS 
{ 
    class Program 
    { 
     private const string DbFile = "bugs.db"; 

     static void Main() 
     { 
      var sessionFactory = CreateSessionFactory(); 
      using (var session = sessionFactory.OpenSession()) 
      { 
       using (var transaction = session.BeginTransaction()) 
       { 
        Bug b = new Bug { BugNumber = 121212 }; 
        session.SaveOrUpdate(b); 
        transaction.Commit(); 
       } 
      } 
     } 

     private static ISessionFactory CreateSessionFactory() 
     { 
      return Fluently.Configure() 
       .Database(SQLiteConfiguration.Standard 
        .UsingFile(DbFile)) 
       .Mappings(m => 
        m.FluentMappings.AddFromAssemblyOf<Program>()) 
       .ExposeConfiguration(BuildSchema) 
       .BuildSessionFactory(); 
     } 

     private static void BuildSchema(Configuration config) 
     { 
      // delete the existing db on each run 
      if (File.Exists(DbFile)) 
       File.Delete(DbFile); 

      // this NHibernate tool takes a configuration (with mapping info in) 
      // and exports a database schema from it 
      new SchemaExport(config) 
       .Create(false, true); 
     } 
    } 
} 

et j'ai l'erreur suivante:

An unhandled exception of type 'NHibernate.MappingException' occurred in NHibernate.dll

Additional information: No persister for: BugNS.Entities.Bug

Je suis désolé, mais j'ai juste commencé à apprendre Fluent et NHibernate à partir des docs. Ce serait génial si quelqu'un connaissait la solution à ce problème, car je passe déjà de nombreuses heures en vain.

Répondre

7

Le niveau d'accès de la classe doit être public pour que Fluent puisse l'utiliser.

les opérations suivantes:

public class Bug 
{ 
    public virtual int Id { get; private set; } 
    public virtual int BugNumber { get; set; } 
} 

public class BugMap : ClassMap<Bug> 
{ 
    public BugMap() 
    { 
     Id(b => b.Id); 
     Map(b => b.BugNumber); 
    } 
} 

C'est un Gotcha pour moi aussi quand je commencé à utiliser Fluent.

Une autre chose qui ne va généralement pas est de manquer le mot-clé virtual, qui est nécessaire pour que NHibernate apporte des modifications à ces propriétés. C'est bien que vous ayez rendu cette partie correcte :)

Espérons que ça aide.

Merci

+1

Merci beaucoup, Visual Studio créé par les classes privées par défaut et non où il est mentionné pour créer des classes publiques. De telles erreurs simples coûtent beaucoup de temps. –

2

Vous devez rendre les classes Bug et BugMap publiques afin que NHibernate/Fluent NHibernate puisse les voir.

Questions connexes