8

Estoy configurando una nueva solución para mapear contra datos SQL que se importaron de una base de datos de Access. Las correlaciones automáticas funcionan bien contra las entidades que he definido, pero necesito poder usar el tipo de mapeo Fluent para dar acceso a la extensión .NotFound.Ignore.Fluidez nHibernate: mapeo no compatible tipo

He utilizado exactamente la misma sintaxis en otro proyecto (¡creo!) Que funciona bien. ¿He cometido un error de colegial al causar el "tipo de mapeo no compatible" IT.Classes.Entities.Admin '"? Cualquier ayuda es muy apreciada.

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] 

Entidad:

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:

usando FluentNHibernate.Mapping; usando 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); 
     } 
    } 
} 

Sesión de fábrica:

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

EDITAR

pensé que iba a exportar las asignaciones de automóviles para ver si sería poner de relieve un problema en mis asignaciones de fluido, pero que parece ser correcta :

<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> 

EDITAR 2

Seguimiento de pila 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

Pensé que la falta de la clave principal en la tabla puede estar causando el problema, por lo que configuro la columna Id como PK pero sigue teniendo el mismo error. – Rowan

+0

Pensamiento adicional: creó una base de datos en blanco y usó la herramienta de generación de esquemas para intentar crear las tablas automáticamente y descartar cualquier problema con la base de datos. Esto todavía falla con el mismo error. – Rowan

+0

¿Cuándo ocurre la excepción? Por favor, publique la excepción completa! Exception.ToString() –

Respuesta

9

En su código de configuración, los tipos mencionados en las asignaciones de Fluent deben ser las clases mapa, no se asignan las clases.

Es decir, en lugar de:

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

que necesita decir:

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

Aún mejor, para no tener una línea separada para cada clase de mapa, utilice el .AddFromAssemblyOf <> () método, que utiliza la reflexión para agregar todos los mapas de clase de un conjunto determinado:

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

¡Gracias, fue un error de colegial! – Rowan

+1

mejor enfoque será heredar todos los mapas a alguna interfaz decir IMap y utilizar .Mappings (m => m.FluentMappings.AddFromAssemblyOf ()) –

Cuestiones relacionadas