ADO.NET导航属性

时间:2010-11-18 14:07:45

标签: c# ado.net linq-to-entities

我在ADO.NET上使用导航属性和继承时遇到了一些问题。

这是我的数据模型:

ADO.NET Data Model

首先,一些词汇:

  

分类=类别
  Formulario =表格
  Campo = Field
  Imagem =图像
  Paragrafo =段落
  Escolha =选择
  Texto =文字
  Resposta =答案

所以,我正在尝试在Form上创建一个自定义属性,返回它的答案数。

正常的做法(我认为)将是:

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 个答案:

答案 0 :(得分:2)

我猜你正在使用Entity Framework 1,或者你没有在Entity Framework 4中启用延迟加载。

在您的课程中,您期望加载Itens集合。情况并非总是如此,因为只有在从数据库中检索出Formulario对象时才显式地加载集合时才会加载集合。

你需要添加两行代码,一切都应该好了:

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

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