2014-10-02 2 views
0

У меня есть статьи и авторские объекты. Автор может иметь много статей, но статья может иметь только 1 Автор:сопоставление nhibernate xml отношение много-к-одному

public class Author 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

public class Article 
{ 
    public virtual int Id {get;set;} 
    public virtual string Title {get;set;} 
    public virtual Author Author {get;set;} 
} 

Вот то, что я до сих пор:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       namespace="Core.Domain.Model" 
       assembly="Core"> 

    <class name="Author" table="Author" dynamic-update="true"> 
    <cache usage="read-write"/> 
    <id name="Id" column="Id" type="int"> 
     <generator class="native"/> 
    </id> 
    <property name="Name" column="Name" type="string"/> 
    </class> 
</hibernate-mapping> 



<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       namespace="Core.Domain.Model" 
       assembly="Core"> 

    <class name="Article" table="Article" dynamic-update="true"> 
    <cache usage="read-write"/> 
    <id name="Id" column="Id" type="int"> 
     <generator class="native"/> 
    </id> 
    <property name="Title" column="Title" type="string"/> 
    <one-to-one name="Author" 
     class="Author" 
     constrained="true"/> 
    </class> 
</hibernate-mapping> 

ошибка, что текущий код бросает это:

Cannot insert the value NULL into column 'AuthorId', table 'NHibernate101.dbo.Article'; column does not allow nulls. INSERT fails. 

Как правильно их сопоставить?

ответ

0

выше прецедентов очень simliar к документированной Например:

Наиболее типичным отображение (без какого-либо, но) Я хотел бы использовать это:

C#

public class Author // new collection mapping 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<Article> Articles { get; set; } 
    ... 
} 

public class Article // as is 
{ 
    public virtual int Id {get;set;} 
    public virtual Author Author {get;set;} 
    ... 
} 

XML

<class name="Author" table="Author" dynamic-update="true" batch-size="25"> 
    ... 
    <bag 
     name="Articles" 
     inverse="true" 
     lazy="true" 
     batch-size="25" 
     cascade="all">    
     <key column="Author_ID"/> 
     <one-to-many class="Article"/>    
    </bag> 

... 
<class name="Article" table="Article" dynamic-update="true" batch-size="25"> 
    ... 
    <many-to-one name="Author" column="Author_ID" not-null="true" /> 

Что мы имеем отображение как отношение заканчивается, когда каждая новая статья должна быть правильно установить ссылку на автора (чтобы все операции записи работают). Таким образом, это должно быть назначение

var author = ... 
var article = ... 
author.Articles.Add(article); 
article.Author = author; 

Это необходимо при создании. Позже NHibernate будет загружать все эти настройки для нас (лениво, если необходимо)

0

Вам нужно много-к-одному в этом случае, не один к одному. Ваш Автор может иметь много Статьи, но статья может содержать только Автор. См. NHibernate Reference Documentation, 5.1.10. many-to-one

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        namespace="Core.Domain.Model" 
        assembly="Core"> 

    <class name="Author" table="Author" dynamic-update="true"> 
     <cache usage="read-write" /> 
     <id name="Id" column="Id" type="int"> 
      <generator class="native" /> 
     </id> 
     <property name="Name" column="Name" type="string" /> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       namespace="Core.Domain.Model" 
       assembly="Core"> 

    <class name="Article" table="Article" dynamic-update="true"> 
     <cache usage="read-write"/> 
     <id name="Id" column="Id" type="int"> 
      <generator class="native"/> 
     </id> 
     <property name="Title" column="Title" type="string"/> 
     <many-to-one name="Author" column="Id" not-null="true" class="Author" /> 
    </class> 
</hibernate-mapping> 
Смежные вопросы