8

Sto configurando una nuova soluzione per mappare i dati SQL che sono stati importati da un database di Access. Le mappature automatiche funzionano bene con le entità che ho definito, ma devo essere in grado di usare il tipo di mappatura Fluent per dare accesso all'estensione .NotFound.Ignore.Fluent nHibernate: Tipo di mappatura non supportato

Ho usato esattamente la stessa sintassi in un altro progetto (credo!) Che funziona bene. Ho commesso un errore di scolaro per causare il "Tipo di mapping non supportato" IT.Classes.Entities.Admin '"? Ogni aiuto è molto apprezzato.

DDL:

CREATE TABLE [dbo].[Admin](
    [ID] [int] NOT NULL, 
    [primaryEmail] [nvarchar](50) NULL, 
    [secondaryEmail] [nvarchar](50) NULL, 
    [highPriorityEmail] [nvarchar](50) NULL, 
    [MobileEmail] [nvarchar](50) NULL, 
    [EmailUser] [bit] NOT NULL, 
    [HelpDeskMessage] [nvarchar](max) NULL 
) ON [PRIMARY] 

Entity:

namespace IT.Classes.Entities 
{ 
    public class Admin 
    { 
    public virtual bool EmailUser { get; set; } 

    public virtual string HelpdeskMessage { get; set; } 

    public virtual string HighPriorityEmail { get; set; } 

    public virtual int Id { get; set; } 

    public virtual string MobileEmail { get; set; } 

    public virtual string PrimaryEmail { get; set; } 

    public virtual string SecondaryEmail { get; set; } 
    } 
} 

Mapping:

utilizzando FluentNHibernate.Mapping; utilizzando IT.Classes.Entities;

namespace IT.Classes.Mappings 
{ 
    public sealed class AdminMap : ClassMap<Admin> 
    { 
     public AdminMap() 
     { 
      this.Id(x => x.Id); 
      this.Map(x => x.EmailUser); 
      this.Map(x => x.HelpdeskMessage); 
      this.Map(x => x.HighPriorityEmail); 
      this.Map(x => x.MobileEmail); 
      this.Map(x => x.PrimaryEmail); 
      this.Map(x => x.SecondaryEmail); 
     } 
    } 
} 

Sessione di fabbrica:

private static ISessionFactory CreateItHelpdeskSessionFactory() 
{ 
    return 
     Fluently.Configure().Database(
      MsSqlConfiguration.MsSql2008.ConnectionString(
       ConfigurationManager.ConnectionStrings["ITHelpdesk"].ConnectionString)) 
       .Mappings(m => m.FluentMappings.Add<Admin>()) 
       .Mappings(m => m.FluentMappings.Add<Applications>()) 
       .Mappings(m => m.FluentMappings.Add<Category>()) 
       .Mappings(m => m.FluentMappings.Add<Log>()) 
       .Mappings(m => m.FluentMappings.Add<Multipliers>()) 
       .Mappings(m => m.FluentMappings.Add<Os>()) 
       .Mappings(m => m.FluentMappings.Add<Priority>()) 
       .Mappings(m => m.FluentMappings.Add<Request>()) 
       .Mappings(m => m.FluentMappings.Add<Status>()) 
       .BuildSessionFactory(); 
} 

EDIT

ho pensato di esportare le mappature auto per vedere se avrebbero evidenziare un problema nel mio mappature fluente ma sembrano essere corretto :

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="IT.Classes.Entities.Admin, ITClasses, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Admin`"> 
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="identity" /> 
    </id> 
    <property name="EmailUser" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="EmailUser" /> 
    </property> 
    <property name="HelpdeskMessage" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="HelpdeskMessage" /> 
    </property> 
    <property name="HighPriorityEmail" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="HighPriorityEmail" /> 
    </property> 
    <property name="MobileEmail" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="MobileEmail" /> 
    </property> 
    <property name="PrimaryEmail" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="PrimaryEmail" /> 
    </property> 
    <property name="SecondaryEmail" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="SecondaryEmail" /> 
    </property> 
    </class> 
</hibernate-mapping> 

EDIT 2

Traccia stack completo. Nota potentialreasons = 0.

FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail. 
---> FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail. 

---> System.InvalidOperationException: Unsupported mapping type 'IT.Classes.Entities.Admin' 
    at FluentNHibernate.PersistenceModel.Add(Type type) in d:\Builds\FluentNH\src\FluentNHibernate\PersistenceModel.cs:line 152 
    at FluentNHibernate.Cfg.FluentMappingsContainer.Apply(PersistenceModel model) in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentMappingsContainer.cs:line 127 
    at FluentNHibernate.Cfg.MappingConfiguration.Apply(Configuration cfg) in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\MappingConfiguration.cs:line 84 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration() in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 252 
    --- End of inner exception stack trace --- 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration() in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 264 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 230 
    --- End of inner exception stack trace --- 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 235 
    at ConsoleChecker.Program.CreateItHelpdeskSessionFactory() in E:\code\code_testing\2010\ASPHelpdesks\ConsoleChecker\Program.cs:line 48 
    at ConsoleChecker.Program.GetRequests() in E:\code\code_testing\2010\ASPHelpdesks\ConsoleChecker\Program.cs:line 40 
    at ConsoleChecker.Program.Main(String[] args) in E:\code\code_testing\2010\ASPHelpdesks\ConsoleChecker\Program.cs:line 24 
+0

Ho pensato che la mancanza della chiave primaria sulla tabella potrebbe causare il problema, quindi ho impostato la colonna Id come PK ma ho ancora lo stesso errore. – Rowan

+0

Inoltre, ha creato un database vuoto e ha utilizzato lo strumento di generazione dello schema per tentare di creare automaticamente le tabelle e escludere eventuali problemi con il database stesso. Ciò non riesce ancora con lo stesso errore. – Rowan

+0

Quando si verifica l'eccezione? Per favore pubblica l'eccezione completa! Exception.ToString() –

risposta

9

Nel codice di configurazione, i tipi di cui Mapping Fluent dovrebbero essere i classi mappa, non le classi essere mappate.

Cioè, invece di:

return 
    Fluently.Configure().Database(
     MsSqlConfiguration.MsSql2008.ConnectionString(
      ConfigurationManager.ConnectionStrings["ITHelpdesk"].ConnectionString)) 
      .Mappings(m => m.FluentMappings.Add<Admin>()) 
      .Mappings(m => m.FluentMappings.Add<Applications>()) 
      .Mappings(m => m.FluentMappings.Add<Category>()) 
      .Mappings(m => m.FluentMappings.Add<Log>()) 
      .Mappings(m => m.FluentMappings.Add<Multipliers>()) 
      .Mappings(m => m.FluentMappings.Add<Os>()) 
      .Mappings(m => m.FluentMappings.Add<Priority>()) 
      .Mappings(m => m.FluentMappings.Add<Request>()) 
      .Mappings(m => m.FluentMappings.Add<Status>()) 
      .BuildSessionFactory(); 

avete bisogno di dire:

return 
    Fluently.Configure().Database(
     MsSqlConfiguration.MsSql2008.ConnectionString(
      ConfigurationManager.ConnectionStrings["ITHelpdesk"].ConnectionString)) 
      .Mappings(m => m.FluentMappings.Add<AdminMap>()) 
      .Mappings(m => m.FluentMappings.Add<ApplicationsMap>()) 
      .Mappings(m => m.FluentMappings.Add<CategoryMap>()) 
      .Mappings(m => m.FluentMappings.Add<LogMap>()) 
      .Mappings(m => m.FluentMappings.Add<MultipliersMap>()) 
      .Mappings(m => m.FluentMappings.Add<OsMap>()) 
      .Mappings(m => m.FluentMappings.Add<PriorityMap>()) 
      .Mappings(m => m.FluentMappings.Add<RequestMap>()) 
      .Mappings(m => m.FluentMappings.Add<StatusMap>()) 
      .BuildSessionFactory(); 

Ancora meglio, per evitare di avere una linea separata per ogni mappa di classe, utilizzare il .AddFromAssemblyOf <> (metodo, che utilizza la riflessione per aggiungere tutte le mappe di classe da un determinato assembly:

return 
    Fluently.Configure().Database(
     MsSqlConfiguration.MsSql2008.ConnectionString(
      ConfigurationManager.ConnectionStrings["ITHelpdesk"].ConnectionString)) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<AdminMap>()) 
      .BuildSessionFactory(); 
+0

Grazie, quindi è stato un errore da scolaro! – Rowan

+1

un approccio migliore sarà ereditato da tutte le mappe su un'interfaccia dire IMap e utilizzare .Mappings (m => m.FluentMappings.AddFromAssemblyOf ()) –

Problemi correlati