Использование интерфейса с навигационным свойством

Я пытаюсь настроить проект, используя Entity Framework 4, POCO и Code-Only.

Возможно ли в рамках сущности для типа навигационного свойства быть интерфейсом?

У меня есть класс "Задача". Задача может быть назначена пользователю или группе, каждая из которых представлена отдельным классом и хранится в отдельных таблицах. Классы выглядят примерно так:

public class User : IAssignable
{
    public string Name { get; set; }
    public int ID { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}

public class Group : IAssignable
{
    public string Name { get; set; }
    public int ID { get; set; }
    public string Manager { get; set; }
    public string Department { get; set; }
}

public class Task
{
    public string Title { get; set; }
    public DateTime DueDate { get; set; }
    public string Details { get; set; }
    public IAssignable AssignedTo { get; set; }
}

Есть ли способ использовать свойство AssignedTo как свойство навигации в структуре сущностей? Я предполагаю, что для EF должен быть какой-то тип дискриминатора, чтобы знать, нужно ли ему искать в таблице "Пользователи" или в таблице "Группы", но я могу выяснить соответствие с помощью Code-Only или EDMX.

Ответ 2

Я знаю, что это старый вопрос, но нет, нет функции Entity Framework (даже последней версии 6), которая позволяет сопоставить свойство навигации с типом интерфейса.

Можно, однако, сопоставить несколько свойств навигации с конкретными типами (и ограничение, которое может быть установлено только один), и предоставить неизолированное свойство типа интерфейса, которое объединяет конкретные свойства навигации в одно свойство. К сожалению, это может сделать ваши запросы более сложными, потому что некоторые запросы должны знать, какие конкретные свойства навигации нужно ссылаться (и вы не можете запросить свое свойство unmapped interface).

Существует значительная сложность вокруг поддержки свойств полиморфной навигации. Подумайте, что должно было бы произойти, чтобы запросить исходное свойство AssignedTo, если вы предполагаете, что оно сопоставлено с столбцом, например AssignedToId int. Вам нужно объединить или присоединиться к наборам объектов User и Group и надеяться, что данный AssignedToId появится только в одном из них. Это подход, используемый при сопоставлении типов Table-Per-Concrete (TPC), но он работает только с наследованием класса (а не с интерфейсами) и осторожным планирование для создания различных идентификаторов по участвующим типам.

Ответ 3

Вы можете сэкономить много работы, используя Инструментарий преобразования текстовых шаблонов (T4), поддерживаемый EF4. Я нашел это после хороших 12 часов поиска пути создания вручную POCOs и интерфейсов,

http://blogofrab.blogspot.com/2010/08/maintenance-free-mocking-for-unit.html

Помимо предоставления блестящей базы для модульного тестирования, она автоматически генерирует навигационные свойства на основе отношений, определенных в вашей модели.