Можно ли использовать дискриминатор типа NHibernate как часть внешнего ключа? - PullRequest
0 голосов
/ 27 декабря 2010

Принимая следующую объектную модель:

public abstract class Entity
{
    public Guid Id { get; set; }
}

public class Category : Entity
{
    public string Name { get; set; }

    public ICollection<LocalizedProperty> LocalizedProperties { get; set; }
}

public class Product : Entity
{
    public string Name { get; set; }

    public ICollection<LocalizedProperty> LocalizedProperties { get; set; }
}

public class LocalizedProperty : Entity
{
    public string CultureName { get; set; }
    public string PropertyName { get; set; }
    public string PropertyValue { get; set; }
}

Можно ли использовать дискриминатор типа вместе с идентификатором объекта в качестве внешнего ключа.Идея состоит в том, что результирующая таблица LocalizedProperties будет иметь вид:

LocalizedProperties
-------------------
Id
EntityType
EntityId
CultureName
PropertyName
PropertyValue

Я знаю, что это возможно при использовании отображения таблицы на подкласс, где каждый из моих «локализованных» объектов наследует от базового класса локализованных объектов, который вочередь имеет связь с LocalizedProperty.Тем не менее, я бы предпочел не иметь этот дополнительный уровень наследования, если это возможно.

Спасибо, Бен

ОБНОВЛЕНИЕ

Спасибо Диего заПредоставление решения с использованием ConfORM.Для тех из вас, кто использует традиционные файлы сопоставления, я преобразовал пример из http://fabiomaulo.blogspot.com/2010/11/conform-any-to-many.html

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" namespace="ConfOrm.UsageExamples.CreateXmlMappingsInBinFolder" assembly="ConfOrm.UsageExamples" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Blog">
    <id name="Id" type="Guid">
      <generator class="guid.comb" />
    </id>
    <property name="Title" />
    <property name="Subtitle" />
    <set name="Tags" cascade="all" where="TagedItemClass = 'ConfOrm.UsageExamples.CreateXmlMappingsInBinFolder.Blog'">
      <key column="TagedItemId" foreign-key="none" />
      <one-to-many class="Tag" />
    </set>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" namespace="ConfOrm.UsageExamples.CreateXmlMappingsInBinFolder" assembly="ConfOrm.UsageExamples" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Tag">
    <id name="Id" type="Guid">
      <generator class="guid.comb" />
    </id>
    <property name="Name" />
    <any id-type="Guid" name="TagedItem">
      <column name="TagedItemClass" />
      <column name="TagedItemId" />
    </any>
  </class>
</hibernate-mapping>

1 Ответ

1 голос
/ 27 декабря 2010

Вы можете использовать <any>.

http://nhibernate.info/doc/nh/en/index.html#mapping-types-anymapping

Для полного примера отметьте http://fabiomaulo.blogspot.com/2010/11/conform-any-to-many.html. Я думаю, это именно то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...