2009-10-18 3 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

В идеале, схема позволит расширения в отдельных местах, с помощью хз: любых деклараций. К сожалению, в схеме nhibernate нет.

Таким образом, вам придется написать свою собственную схему и импортировать существующую схему. При таком подходе вы можете получать новые типы схем из существующих типов базовых схем. К сожалению, элемент class nhibernate определен с использованием анонимного типа, который вы не можете продлить. Таким образом, вам нужно будет определить свой собственный элемент класса и скопировать модель контента nhibernate, расширяя его по желанию.

Как следствие, приложения, обрабатывающие базовую схему, вероятно, не смогут обрабатывать вашу расширенную схему, поэтому вам также придется переписать все инструменты.

+0

Это не совсем так. См. Мой ответ. –

0

Вы можете использовать теги <meta>, чтобы добавить дополнительную информацию в файлы сопоставления NHibernate. Это редко используется и плохо документирована.

Documentation (для генерации кода Java Hibernate, но она может быть использована для чего-нибудь еще)

Mapping:

<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"); 
    // ... 
    } 
}