2010-02-08 51 views
2

嗨我試圖在一個位置保持基類的公共屬性,並使用XML ENTITY在Nhibernate映射文件中引用。在Nhibernate中使用Doctype

映射文件

<?xml version="1.0" encoding="utf-8" ?> 
<!DOCTYPE hibernate-mapping [ 
    <!ENTITY BasePropertyList SYSTEM "BasePropertyList.xml"> 
]> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
assembly="Model" namespace= "Model" default-lazy="false"> 
<class name="DerivedClass"> 
    &BasePropertyList; 
</class> 
</hibernate-mapping> 

BasePropertyList.xml

<id name="ID" column="ID" type="Int32" unsaved-value="0"> 
<generator class="native"></generator> 
</id> 
<property name="CreatedDate" update="false" /> 
<property name="CreatedBy" update="false" /> 
<property name="LastModifiedDate" /> 
<property name="LastModifiedBy" /> 

我得到以下異常

System.Xml.XmlException:DTD是此XML文檔中禁止。 在NHibernate.Cfg.Configuration.LogAndThrow(例外例外)

我在這裏丟失什麼? DOCTYPE如何在Nhibernate映射文件中工作?

+0

我不知道doctype,但爲什麼不使用basepropertylist中屬性的公共子類?這將節省您一些ctrl + c/ctrl + v的 – Paco 2010-02-08 21:20:21

+0

@Paco ...我假設OP已經完成了這些對象,現在也希望繼承在映射文件中工作。 AFAIK這是不可能做到這一點與映射文件... – dotjoe 2010-02-08 21:30:22

+0

我指的是從Nhibernate文檔本節。 <<<<< 「如果您想避免重複,請考慮使用XML實體(例如DOCTYPE聲明中的[<!ENTITY allproperties SYSTEM」allproperties.xml「>]和映射中的&allproperties;)」 >> >> – sukh 2010-02-11 23:49:12

回答

0

我不知道如何解決DOCTYPE問題,但我從來沒有認爲它是一個功能。

如果要映射繼承,您可以使用The documentation

描述你的情況這三個戰略之一,每類表可能是映射的最佳途徑。這意味着在每個映射文件中重複xml。我不認爲有一種方法可以避免這種情況,除非在基類發生變化時(這不是避免該問題的真正方法),用一些宏或構建腳本重新創建xml。您也可以通過使用FluentNhibernate而不是xml來避免此問題,並繼承基類的ClassMap類(這是我個人在項目中具有公共基類時所做的)。

如果您希望能夠在一個查詢中查詢數據庫中所有對象的屬性,您可能會喜歡每個子類映射策略的表。每個子類的表不需要重複的xml,但是向查詢添加了一個sql連接。

0

它在當前版本中被打破。 我有同樣的問題,我測試版本2.0.1,2.1.0,2.1.1,2.1.2和它被打破

如果我正確地讀this,它不會被修復,似乎是這是在參考文檔中遺留下來的