NHibernate один на один - PullRequest
       2

NHibernate один на один

6 голосов
/ 21 июня 2011

У меня проблема с использованием сопоставления один к одному. Я искал в интернете и нашел много решений, но ни одно не удовлетворило. Большинство примеров несут накладные расходы по хранению родительского экземпляра в дочернем классе.

Я хочу использовать только родительский идентификатор в дочернем классе, имеющий отношение ограничения внешнего ключа, но не хочу сохранять родительский экземпляр в дочернем.

Когда я пытаюсь загрузить записи из базы данных, возникает исключение «Строка с указанным идентификатором не существует [AssemblyName.]». Но запись существует в таблице "B" правильно.

Какие-либо решения для этой проблемы?

Структура класса:

class A { 
public virtual string Id {get;set;} 
public virtual B B {get;set;} // properties...... } 

class B { public virtual string Id {get;set;} // properties...... 
public virtual string ParentId { get;set;} // class A Id }

Структура базы данных:

CREATE TABLE [A]( 
    [Id] [nvarchar](45) PRIMARY KEY
) ON [PRIMARY] 

CREATE TABLE [B]( 
    [Id] [nvarchar](45) PRIMARY KEY, 
    [ParentId] [nvarchar](45) NOT NULL
) ON [PRIMARY]

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

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
<class name="A,AssemblyName" table="A" lazy="true">
<id name="Id" column="Id" type="string"> 
<generator class="assigned"/> 
</id> 
<one-to-one name="_B" cascade="all" fetch="join" foreign-key="None" constrained="true" class="B"/> 
</class> 
</hibernate-mapping>


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="B,AssemblyName" table="B" lazy="true"> 
<id name="Id" column="Id" type="string"> <generator class="assigned"/> </id>
<property name="_Name" column="Name"/> </class> 
</hibernate-mapping>

Ответы [ 2 ]

4 голосов
/ 21 июня 2011

Связи один-к-одному всегда являются двунаправленными в NHibernate. Отображение класса B является неполным:

<class name="B,AssemblyName" table="B" lazy="true"> 
   <id name="Id" column="Id" type="string">
      <generator class="assigned"/>
   </id>
   <many-to-one name="A" unique="true" column="A" />
   <property name="_Name" column="Name"/>
</class>

Это ассоциация внешнего ключа. Для получения дополнительной информации см. этот подробный пост в блоге Ayende или документацию NHibernate .

0 голосов
/ 21 июня 2011

Читать это .«Настоящим» один-к-одному нужен один и тот же первичный ключ в обеих таблицах (и без столбца ParentId).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...