2009-10-18 89 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"); 
    // ... 
    } 
}