[英]mapping nhibernate xml many-to-one relationship
我有文章和作者對象。 一個作者可以有很多文章,但是一個文章只能有1個作者:
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.
如何正確映射這些?
在這種情況下,您需要多對一,而不是一對一。 您的作者可以有很多文章,但是一篇文章只能有一個作者。 參見NHibernate參考文檔,5.1.10。 許多到一
<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>
上面的用例與已記錄的示例非常相似:
我將使用的最典型的映射(沒有任何映射)是:
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" />
我們所擁有的是兩個關系端的映射,其中每個新Article必須具有對Author的正確設置的引用(以使所有WRITE操作起作用)。 所以這應該是分配
var author = ...
var article = ...
author.Articles.Add(article);
article.Author = author;
在創建期間必須這樣做。 稍后,NHibernate將為我們加載所有這些設置(如果需要,可以延遲加載)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.