2010-03-15 2 views
0

Предположим, что у меня есть несколько определений вроде так:Интерфейс -> Entity Mapping

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

+0

У вас возникли проблемы с отображением интерфейса (ICategory) в таблицу? –

+0

Hey shimms - В основном я получаю следующую ошибку: «Ассоциация из таблицы. Категории относятся к неотображаемому классу:« Я не уверен, ответил ли я на ваш вопрос. Karan – kidoman

+0

Просто нашел что-то, что может быть актуальным: http://stackoverflow.com/questions/849664/fluent-nhibernate-how-do-i-map-an-entity-with-a-property-whos-type- is-an-interf – kidoman

ответ

0

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; 
    } 
} 

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

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

+0

Это то, что я придумал ... он, вероятно, отлично работает для более простых свойств (например, выше), но для коллекций он определенно не оптимален. Есть ли более простое решение в Entity Framework 4? – kidoman

+0

Мы используем тот же подход для коллекций (т. Е. Детей, а не родителей). Я не знаю об EF4, извините. –

+0

Я как бы надеялся, что NHibernate будет немного более способным в этой области. Я оглядываюсь на более технически «звуковое» решение. Спасибо за помощь. – kidoman

0

Я не знал об этой проблеме о сопоставлении иерархии с помощью 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> 

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

Для получения дополнительной информации по этому вопросу вы можете обратиться к NHibernate Reference Documentation, Chapter 8 - Inheritence mapping. Что касается отображения компонентов, вы хотите проверить Chapter 7 - Component Mapping.

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

Смежные вопросы