“扩展”一个xml架构

时间:2009-10-18 20:35:05

标签: xml nhibernate-mapping xsd

我正在尝试“扩展”一个xml架构(例如,这里是nhibernate),在其中添加我自己的实体。 我坚持认为“exm:foo”(和exm:foobar)实体上的验证窒息,因为“基础”架构不允许它。如何在不更改基本架构的情况下设法做到这一点?

示例:

<?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 个答案:

答案 0 :(得分:2)

理想情况下,模式允许通过xs:any声明在选定位置进行扩展。不幸的是,nhibernate架构没有。

因此,您必须编写自己的架构,并导入现有架构。在这种方法中,您可以从现有的基础模式类型派生新的模式类型。不幸的是,nhibernate的元素class是使用您无法扩展的匿名类型定义的。因此,您必须定义自己的类元素并复制nhibernate的内容模型,并将其扩展到所需的位置。

因此,处理基础架构的应用程序可能无法处理扩展架构,因此您还必须重写所有工具。

答案 1 :(得分: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>

您可以从配置中读取元标记

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