2014-10-02 162 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>