2010-01-01 13 views
5

definiere ich eine einfache Bug Klasse:Keine persister für Entity

using System; 

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

und eine einfache Zuordnerklasse:

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

und dann nur versuchen, es zu benutzen mag:

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

und ich habe den folgenden Fehler erhalten:

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

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

Es tut mir leid, aber ich habe gerade angefangen, Fluent und NHibernate aus der Dokumentation zu lernen. Es wäre toll, wenn jemand die Lösung für dieses Problem kennt, da ich schon viele Stunden vergeblich bin.

Antwort

7

Zugriffsstufe der Klasse muss public für Fluent sein, um davon Gebrauch zu machen.

Versuchen Sie Folgendes:

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

Dies ist ein Gotcha ist für mich auch, wenn ich mit Fluent gestartet.

Eine weitere Sache, die im Allgemeinen schief geht, ist virtual Schlüsselwort fehlt, die für NHibernate benötigt wird, um Änderungen an diesen Eigenschaften vorzunehmen. Es ist schön, dass Sie diesen Teil richtig gemacht haben :)

Hoffe, dass hilft.

Dank

+1

Vielen Dank, Visual Studio erstellt standardmäßig private Klassen und keine wo es erwähnt, um öffentliche Klassen zu erstellen. Solche einfachen Fehler kosten viel Zeit. –

2

Sie müssen die Klassen Bug und BugMap öffentlich machen, damit NHibernate/Fluent NHibernate sie sehen können.

Verwandte Themen