Проблема с унаследованными таблицами в Entity Framework 4.1 - PullRequest
0 голосов
/ 31 января 2012

У меня есть проблема в Entity Framework 4.1, с которой я, кажется, ходил кругами. Я пытаюсь создать простой домен, в котором у меня есть таблица дел, которая имеет отношение 1..M к таблице вопросов. Затем у меня есть унаследованная таблица («Унаследованный вопрос»), которая разделяет идентификатор из таблицы вопросов.

Я хотел бы связать классы Question и InheritedQuestion со случаем, с которым они связаны, чтобы я мог сделать что-то вроде:

var inheritedCase = context.Set<Case<InheritedQuestion>>.First();
InheritedQuestion inheritedQuestion = inheritedCase.Case.Questions.First();

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

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

Таблица случаев
Идентификатор (ПК)

Таблица вопросов
CaseId (FK)
QuestionId (PK)
Field1

Унаследованный вопрос
QuestionId (FK)
Field2

Это мои занятия.

public class Case<T> where T : Question
{
  ICollection<T> Questions {get;set;}
}

public class Question
{
  string Field1 {get;set;}
  Case<Question> Case {get;set;}
}

public class InheritedQuestion : Question
{
  string Field2 {get;set;}
  new Case<InheritedQuestion> Case {get;set;}
}

1 Ответ

1 голос
/ 01 февраля 2012

Это невозможно. Вы должны использовать это:

public class Case
{
  ICollection<Question> Questions {get;set;}
}

public class Question
{
  string Field1 {get;set;}
  Case Case {get;set;}
}

public class InheritedQuestion : Question
{
  string Field2 {get;set;}
}

Теперь ваше дело должно быть в состоянии ассоциироваться как с вопросами, так и с унаследованными.

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

Для поддержки нескольких типов дел вы можете попробовать это:

// Not mapped class!
public abstract BaseCase<T> where T : question
{
    ICollection<T> Questions { get; set; }
}

// Mapped entities
public Case : BaseCase<Question> { }
public Case2 : BaseCase<InheritedQuestion> { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...