Свойства навигации ADO.NET - PullRequest
3 голосов
/ 18 ноября 2010

У меня небольшая проблема с использованием свойств навигации и наследования в ADO.NET.

Это моя модель данных:

ADO.NET Data Model

Сначала некоторыесловарь:

Категория = Категория
Formulario = Форма
Campo = Поле
Imagem = Изображение
Paragrafo = Абзац
Escolha = Выбор
Текст = Текст
Resposta = Ответ

Итак, я пытаюсь создать собственное свойство в Форме, возвращающее количество ответов.

Обычный подход (я думаю) будет таким:

public partial class Formulario
{
    public int Respostas
    {
        get
        {
            List<Item> itens = this.Itens.ToList();

            IEnumerable<Campo> campos = from m in itens where m as Campo != null select (Campo)m;
            int soma = campos.Sum(m => m.Respostas.Count);

            return soma;
        }
    }
}

Но это не работает.Список itens возвращает 0 элементов.Но когда я делаю, как показано ниже, он возвращает 4 элемента, которые он должен:

public partial class Formulario
{
    public int Respostas
    {
        get
        {
            FormulariosDB db = new FormulariosDB();

            List<Item> itens = db.Items.Where(m => m.Formulario.Id == this.Id).ToList();

            IEnumerable<Campo> campos = from m in itens where m as Campo != null select (Campo)m;
            int soma = campos.Sum(m => m.Respostas.Count);

            return soma;
        }
    }
}

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

PS: я использую метод .toList(), поэтому я могу использовать все Linq запросы, а не только те, которые Linq2Entities позволяют мне

1 Ответ

2 голосов
/ 18 ноября 2010

Я предполагаю, что вы либо используете Entity Framework 1, либо у вас не включена отложенная загрузка в Entity Framework 4.

В вашем классе вы ожидаете загрузки коллекции Itens. Это не всегда так, поскольку коллекция будет загружаться только в том случае, если она явно загружена при получении объекта Formulario из базы данных.

Вам нужно добавить две строки кода, и все должно быть хорошо:

if(!Itens.IsLoaded)
    Itens.Load();

List<Item> itens = Itens.ToList();
...