2009-10-18 87 views
2

我想「擴展」一個XML模式(例如在這裏nhibernate),以添加我自己的實體內部。 我堅持在「exm:foo」(和exm:foobar)實體上進行驗證扼流點,因爲「基本」模式不允許它。我如何設法做到這一點,而不改變基本模式?「擴展」一個XML模式

樣品:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Test" namespace="Test.DataAccess.Entities" xmlns:exm="urn:extend-mappings"> 
    <class name="Post" table="POSTS" xmlns="urn:nhibernate-mapping-2.2" > 
    <exm:foo bar="baz" /> 

    <property name="Body" type="String" column="BODY"> 
     <exm:foobar /> 
    </property> 

    [...] 

    </class> 
</hibernate-mapping> 

回答

2

理想的情況下,一個模式將允許選擇的地方延伸,通過XS的手段:任何聲明。不幸的是,nhibernate模式沒有。

所以你將不得不編寫自己的模式,並導入現有的模式。在這種方法中,您可以從現有基本模式類型中派生新的模式類型。不幸的是,nhibernate的元素class是使用您無法擴展的匿名類型定義的。所以你必須定義你自己的類元素並複製nhibernate的內容模型,並在需要時擴展它。

因此,處理基本模式的應用程序可能無法處理擴展模式,因此您還必須重寫所有工具。

+0

這不完全正確。看到我的答案。 – 2011-05-26 09:27:06

0

您可以使用<meta>標籤將附加信息放入NHibernate映射文件中。這是一個很少使用和記錄不完善的功能。

Documentation(對Hibernate的Java代碼生成,但它可以用於任何其他)

映射:

<class name="Post" table="POSTS" xmlns="urn:nhibernate-mapping-2.2" > 
    <meta attribut="bar">baz</meta> 

    <property name="Body" type="String" column="BODY"> 
    <meta attribute="property-bar">property-baz</meta> 
    </property> 

    <!-- ... --> 
</class> 

你可以閱讀從配置meta標籤

foreach (PersistentClass persistentClass in Configuration.ClassMappings()) 
{ 
    MetaAttributes attribute = persistentClass.GetMetaAttribute("bar"); 
    // ... 
    foreach(Property property in persistentClass.PropertyIterator()) 
    { 
    MetaAttributes propertyAttribute = property.GetMetaAttribute("property-bar"); 
    // ... 
    } 
}