Интерфейс -> Entity Mapping - PullRequest
       18

Интерфейс -> Entity Mapping

0 голосов
/ 15 марта 2010

Предположим, у меня есть несколько таких определений:

public interface ICategory
{
    int ID { get; set; }
    string Name { get; set; }
    ICategory Parent { get; set; }
}

public class Category : ICategory
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
    public virtual ICategory Parent { get; set; }
}

Как мне сопоставить такой сценарий в NHibernate / EF 4? Я пытаюсь отделить реализацию DAL.

Я изучаю NHibernate, EF 4.

С уважением, Karan

Ответы [ 2 ]

0 голосов
/ 15 марта 2010

Мне не было известно об этой проблеме с отображением иерархии с помощью NHibernate. Однако, возможно, вы уже знаете, сообщаете ли вы об этой проблеме, вот как это следует сделать:

<class name="ICategory" table="Categories">
  <id name="ID" column="IdCategory">
    <generator class="identity">
  </id>
  <property name="Name"/>
  <component name="Parent" class="ICategory"> <!-- class attribute is normally optional -->
    <!-- Here, I would have some test to do to determine whether we have to list the properties -->
    <!-- I would say no and this would makes sense to me, but without having tested it, I can't confirm. -->
  </component>
  <union-subclass="Category">
    ...
  </union-subclass>
</class>

Если ваш класс объекта Category не предоставляет больше свойств, чем интерфейс ICategory, вы можете поместить все свойства в родительский элемент class , а затем объявить только свой последующий union подкласс объект внутри него.

Возможно, вы захотите обратиться к справочной документации NHibernate, глава 8 - Отображение наследования для получения более подробной информации по этому вопросу. Что касается сопоставления компонентов, вы хотите проверить Глава 7 - Сопоставление компонентов .

Что касается EF4, я не могу помочь, так как никогда не работал с ним. К сожалению.

0 голосов
/ 15 марта 2010

У NHibernate есть проблемы с отображением интерфейсов в таблицы.

Мы обошли это, создав защищенную переменную конкретного типа, которая используется для отображения, и выставив тип интерфейса в качестве получателя / установщика для этого конкретного типа:

// this is mapped to the table
protected virtual Category ConcreteParent { get; set; }

// this is used to access the mapped one
public virtual ICategory Parent 
{ 
    get
    {
        return (ICategory)ConcreteParent;
    } 
    set
    {
        ConcreteParent = (Category)value;
    }
}

(Этот код не в моей голове - я уверен, что в нем будет скрыта синтаксическая ошибка, но идея есть).

Это не самая красивая реализация, и она выглядит ужасно, но она работает. Возможно, кто-то еще увидит это и найдет альтернативу :).

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