Fluent nHibernate: неподдерживаемый тип сопоставления

Я настраиваю новое решение для сопоставления с данными SQL, импортированными из базы данных Access. Автоматические сопоставления отлично работают с объектами, которые я определил, но мне нужно иметь возможность использовать тип сопоставления Fluent, чтобы предоставить доступ к расширению .NotFound.Ignore.

Я использовал точно такой же синтаксис в другом проекте (я думаю!), Который отлично работает. Я сделал школьную ошибку, чтобы вызвать "Неподдерживаемый тип сопоставления 'IT.Classes.Entities.Admin'"? Любая помощь очень ценится.

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]

Организация:

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

Отображение:

using FluentNHibernate.Mapping; используя 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);
        }
    }
}

Фабрика сеансов:

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

ИЗМЕНИТЬ

Я думал, что экспортирую автоматические сопоставления, чтобы увидеть, будут ли они выделять проблему в моих текущих сопоставлениях, но они кажутся правильными:

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

ИЗМЕНИТЬ 2

Полная трассировка стека. Обратите внимание на потенциальные причины = 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

person Rowan    schedule 03.01.2012    source источник
comment
У меня возникла мысль, что отсутствие первичного ключа в таблице может быть причиной проблемы, поэтому я установил столбец Id как PK, но все еще та же ошибка.   -  person Rowan    schedule 04.01.2012
comment
Дальнейшие размышления - создали пустую базу данных и использовали инструмент генерации схемы, чтобы попытаться создать таблицы автоматически и исключить любые проблемы с самой базой данных. Это все еще не удается с той же ошибкой.   -  person Rowan    schedule 04.01.2012
comment
Когда возникает исключение? Выложите, пожалуйста, полное исключение! Exception.ToString ()   -  person Cole W    schedule 04.01.2012
comment
Это твой единственный урок? Возможно, вы ссылаетесь на него из другого и используете Map вместо References.   -  person Diego Mijelshon    schedule 04.01.2012
comment
@ColeW Я поместил трассировку стека в основную часть вопроса   -  person Rowan    schedule 04.01.2012
comment
@DiegoMijelshon У меня есть другие классы, но я использовал их в качестве примера. Я пробовал подключиться к этим другим классам, но они дают те же ошибки. У меня нет ссылок на админ-класс из других классов.   -  person Rowan    schedule 04.01.2012
comment
Какие-нибудь из ваших сопоставлений работают? Можете ли вы прокомментировать .Mappings (m = ›m.FluentMappings.Add ‹Admin› ()), чтобы увидеть, работает ли следующий? Также гораздо проще использовать вместо этого что-то вроде этого: m.FluentMappings.AddFromAssemblyOf<OrderMap>()   -  person Cole W    schedule 04.01.2012
comment
@ColeW Это очень помогло. Я изменил сопоставление на использование .Mappings (m = ›m.FluentMappings.AddFromAssemblyOf ‹Admin› ()), и код работает, однако вложенные классы недоступны (придется еще немного поработать с моими файлами сопоставления). Странно, как когда сущности вызываются индивидуально, они терпят неудачу.   -  person Rowan    schedule 04.01.2012
comment
@ColeW и ответить на ваш другой вопрос - ни один из них не работает, если вызывается из метода .Add ‹T›.   -  person Rowan    schedule 04.01.2012


Ответы (1)


В вашем коде конфигурации типы, упомянутые в Fluent Mappings, должны быть классами карты, а не классами, которые отображаются.

То есть вместо:

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

Вам нужно сказать:

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

Еще лучше, чтобы избежать отдельной строки для каждой карты классов, используйте метод .AddFromAssemblyOf ‹> (), который использует отражение для добавления всех карт классов из данной сборки:

return
    Fluently.Configure().Database(
        MsSqlConfiguration.MsSql2008.ConnectionString(
            ConfigurationManager.ConnectionStrings["ITHelpdesk"].ConnectionString))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<AdminMap>())
            .BuildSessionFactory();
person Ian Nelson    schedule 04.01.2012
comment
лучший подход будет наследовать все карты в некотором интерфейсе, например IMap и использовать .Mappings (m = ›m.FluentMappings.AddFromAssemblyOf‹ NameSpace.IMap ›()) - person Saboor Awan; 13.08.2013