Подтвердить что ты не робот

NHibernate DuplicateMappingException, когда два класса имеют одинаковое имя, но разные пространства имен

У меня есть класс в корне моей модели домена, который выглядит так:

namespace Domain
{
  public class Foo { ... }
}

У меня также есть другой класс с тем же именем в другом пространстве имен:

namespace Domain.SubDomain
{
  public class Foo { ... }
}

Для моих сопоставлений у меня есть каталог Mapping с подкаталогом под названием SubDomain, который содержит сопоставления для классов домена, найденных в пространстве имен Domain.SubDomain. Все они находятся в одной и той же сборке.

Однако, когда я пытаюсь загрузить их с помощью NHibernate, я продолжаю получать DuplicateMappingException... хотя оба Foos имеют разные пространства имен. Код, который я использую для загрузки моей конфигурации NHibernate, таков:

var cfg = new Configuration()
  .Configure()                
  .AddAssembly("Domain");   

Как я могу сообщить NHibernate, чтобы я мог использовать два объекта с тем же именем (но разными пространствами имен)?

4b9b3361

Ответ 1

Я нашел ответ на веб-сайте Hibernate:

Если у вас есть два постоянных класса с тем же самым неквалифицированным именем, вы должен установить auto-import = "false". исключение будет возникать, если вы попытаетесь присвоить два класса тому же "импортированное" имя.

Я использовал это как атрибут для тега <hibernate-mapping>, и он сработал.

Ответ 2

У меня была та же проблема. Я решил это так:

Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                .ConnectionString(...)
                .AdoNetBatchSize(500))
            .Mappings(m => m.FluentMappings
                .Conventions.Setup(x => x.Add(AutoImport.Never()))
                .AddFromAssembly(...)
                .AddFromAssembly(...)
                .AddFromAssembly(...)
                .AddFromAssembly(...))
            ;

Импортированная часть: .Conventions.Setup(x => x.Add(AutoImport.Never())). Кажется, что все хорошо работает с этой конфигурацией.

Ответ 3

Вы можете указать полное имя классов в документе сопоставления следующим образом:

<class name="SeeMe.Data.People.Relationship, SeeMe.Data" ... > ...

Где SeeMe.Data - это сборка.