Использование интерфейса со свойством навигации - PullRequest
10 голосов
/ 07 января 2010

Я пытаюсь настроить проект, используя 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.

Ответы [ 3 ]

1 голос
/ 09 декабря 2013

вы можете использовать интерфейс в свойстве навигации, посмотрите на это решение, так же как и на вопрос: Как использовать свойства интерфейса с CodeFirst

1 голос
/ 05 января 2015

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

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

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

0 голосов
/ 05 декабря 2010

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

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

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

...