2010-09-12 6 views
4

Я начал свой набег на C# .NET и NHibernate, и я, наконец, застрял в исключении, я не могу понять, и Google не помогает.NHibernate Проблема дублирования класса/сущности

Я получаю NHibernate.DuplicateMappingException: Дублировать сопоставление класса/сущности в моем классе родителя. Ниже мой файл отображения для класса Родитель и молодежи класс, который использует класс Parent:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Surrix.Cerberus.YouthData" 
        namespace="Surrix.Cerberus.YouthData.Domain"> 
    <class name="Parent"> 
    <id name="parentId"> 
     <generator class="guid" /> 
    </id> 
    <property name="firstName" not-null="true" /> 
    <property name="lastName" not-null="true" /> 
    <property name="homePhone" /> 
    <property name="parentEmail" /> 
    <property name="relationshipToYouth" /> 

    <!-- Address component that should map to the Address class --> 
    <component name="parentAddress"> 
     <property name="street" /> 
     <property name="state" /> 
     <property name="zipCode" /> 
     <property name="city" /> 
    </component> 

    </class> 

</hibernate-mapping> 

А вот соответствующие части молодежи класса (это значительно больше)

<set name="YouthParents" table="YouthParents" cascade="none"> 
    <key column="youthId" /> 
    <many-to-many column="parentId" class="Parent"/> 
</set> 

Только в том, что класс Youth также обладает свойствами firstName и lastName, но я не вижу, что это проблема.

ответ

7

Вы добавляете файл или сборку, содержащую сопоставление дважды, в свой объект Configuration.

+0

Звучит так, как будто это может быть правильно. В настоящее время я загружаю объект «Конфигурация» в сборке и создаю еще один внутри моего тестового класса, чтобы я мог экспортировать схему. Есть ли другой способ справиться с этим? –

+0

Вы должны создать свою конфигурацию в одном месте, но проблема заключается в том, как вы добавляете сопоставления. Вы должны опубликовать код для этого. –

+0

Хотя этот ответ не полностью довел меня до конечного результата, он действительно установил меня по пути. Если бы я разместил остальную часть своих HBM, я уверен, что это было бы выяснено. В Youth hbm я ссылаюсь на родителя и на другие классы. Поэтому, когда вы добавляете свои сборки в объект Configuration, вам нужно добавить объект Youth. По крайней мере, это то, что исправило мою проблему. –

0

Поскольку он дает дублирующее сопоставление сущности класса, я могу только вообразить, что у вас есть два или более файла * .xml.hbm, относящихся к одному классу .net.

Убедитесь, что элемент класса xml для вашего класса Youth не имеет того же значения для атрибута name.

14

Убедитесь, что вы не из этих 2 вещей.

(1) добавление узла в коде:

// Code Configuration 
var cfg = new Configuration(); 
cfg.Configure(); 
cfg.AddAssembly(typeof(Employee).Assembly); 
// Presuming Employee resides in "MyAssembly" as seen below. 

(2) А затем также добавлять сборку в конфигурационном файле:

<!-- .config configuration --> 
<session-factory> 
    <!-- bunch of other stuff --> 
    <mapping assembly="MyAssembly"/> <!-- as in MyAssembly.dll --> 
</session-factory> 
+0

Дополнительная информация об этом ответе [здесь] (http://elliottjorgensen.com/nhibernate-api-ref/NHibernate.Cfg/Configuration.html). Я закончил использование 'cfg.AddAssembly (Assembly.GetExecutingAssembly()), который решил мою проблему. – justanotherdev

2

Я имел эту проблему, и решил его, поставив это заявление в hibernate.cfg.xml файл:

<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
1

Другой возможной причиной возникновения этой ошибки является несколько файлов hbm, ссылающихся на одну и ту же сборку во время Configuration.AddAssembly.

Все файлы hbm в одной сборке обрабатываются одним вызовом AddAssembly.