NHibernate DuplicateMappingException, когда два класса имеют одинаковое имя, но разные пространства имен - PullRequest
25 голосов
/ 21 июля 2009

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

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 разрешить мне использовать две сущности с одинаковыми именами (но с разными пространствами имен)?

Ответы [ 3 ]

23 голосов
/ 29 августа 2009

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

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

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

16 голосов
/ 29 апреля 2011

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

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 голосов
/ 21 июля 2009

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

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

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

...