Тип интерфейса навигации Entity Framework - PullRequest
4 голосов
/ 20 января 2012

Я создаю приложение, использующее объектную платформу, и сначала сталкиваюсь с некоторыми проблемами с ограничениями EF, следуя принципу интеграции интерфейса.Part of application model architecture in UML

    public interface IProduct
{
    int Id { get; set; }
    ICollection<IProcess> Processes { get; set; }
    ICollection<ILine> Lines { get; set; }
    String Description { get; set; }
    String Number { get; set; }
    String Name { get; set; }
}

Проблема в том, что свойство Processes and Lines не может определить, какой класс в конкретном типе (я полагаю).

Я знаю, что могу достичьто же самое с использованием абстрактных классов.Причина, по которой я не сделал этого, заключается в том, что я считаю неправильным менять модель из-за ограничений EF.

Каков будет лучший способ решить эту проблему?Любая альтернатива EF, которая допускает интерфейсы как свойство навигации.

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Есть только один способ решить эту проблему - использовать конкретные классы, сохраненные в базе данных. EF не поддерживает никакой другой способ. Даже использование абстрактных классов не поможет вам, если вы не отобразите все дерево наследования (не делайте этого).

Если вы хотите, чтобы свойство предоставляло интерфейс, вы должны предложить второе не сопоставленное свойство, которое будет выполнять преобразование из свойства, представляющего конкретный тип внутри.

Просто, если вы хотите использовать EF, вы должны изменить свою архитектуру, чтобы следовать ее набору функций.

0 голосов
/ 08 июля 2014

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

В основном у меня есть два интерфейса

public interface IProduct
{
    int Id { get; set; }
    String Description { get; set; }
    String Number { get; set; }
    String Name { get; set; }
}

и

public interface IEFProduct
{
    ICollection<IProcess> Processes { get; set; }
    ICollection<ILine> Lines { get; set; }
}

Я сохраняю интерфейс IProduct в моем проекте контрактов, поэтому он все еще полностью независим от остальной части моей модели, но я включил интерфейс IEFProduct в свой проект Model, поскольку он содержит конкретныйреализация.Это означает, что я не могу получить доступ к процессам и строкам из чего-либо, что реализует интерфейс, а не из конкретного типа, но в моем случае это помогло мне решить проблему.

Другой путь вперед - использование DTO.

Все ваши модели будут использовать интерфейс, но ваша фактическая реализация EF будет использовать Конкретные DTO, в слое данных вы будете отображать их между собой либо вручную, либо с использованием Automapper - конечно, это может оказать небольшое влияние на производительность.

...