我正在尝试“扩展”一个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>
答案 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");
// ...
}
}