Entity Framework Inheritance - PullRequest
       4

Entity Framework Inheritance

1 голос
/ 21 декабря 2010

Я рассмотрел несколько возможных решений моей проблемы, но не нашел правильного.

Мне нужен полный набор, то есть мне нужно выбрать типы, которые также имеют базовый тип. то есть тип ActionHistory, а также все остальные, которые наследуются от базового класса ActionHistory. Моя проблема заключалась в том, что я получал все сущности, но у объектов типа ActionUpdate не было заполненной коллекции ActionUpdateDetails.

Моя проблема в том, что я не могу получить данные ActionUpdateDetails в производном классе ActionUpdate .

В модели есть три класса:

public class ActionHistory
{
public int Id {get;set;}
}

public class ActionUpdate : ActionHistory
{
public ICollection<ActionUpdateDetail> ActionUpdateDetails{get;set;}
}

public class ActionUpdateDetail
{
int Id{get;set;}
public string Field{get;set;}
public string Value{get;set;}
}

Я попытался реализовать решение из этого предложения: Entity Framework: наследование и включение

Как это:

var result = from actionHistory in ActionHistories
select new {
actionHistory,
actionUpdateDetails = actionHistory is ActionUpdate ? 
(actionHistory as ActionUpdate).ActionUpdateDetails : null
};

Все, что я получаю, это сообщение об исключении:

Невозможно создать постоянное значение типа 'System.Collections.Generic.ICollection`1'. В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

Затем я попытался смоделировать ситуацию вне EF, и это сработало. Я использую модель POCO и извлек соответствующие классы в отдельный проект, заполнил образец структуры данными и успешно проверил его, т. Е. ActionUpdateDetails коллекция была заполнена данными.

Любая помощь в этом будет оценена!

* * +1032 Н. * * тысяча тридцать три

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Что касается вашего ответа, на самом деле правильный способ - использовать OfType<T>:

var actionUpdateDetails = ctx.ActionHistories
                       .OfType<ActionUpdate>()
                       .Select(x => x.ActionUpdateDetails)
                       .ToList();

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

0 голосов
/ 21 декабря 2010
var result = from actionHistory in ActionHistories
select new
{
    actionHistory,
    ActionUpdateDetails = (actionHistory as ActionUpdate).ActionUpdateDetails
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...