代码之家  ›  专栏  ›  技术社区  ›  Rodrigo Waltenberg

ADO.NET导航属性

  •  3
  • Rodrigo Waltenberg  · 技术社区  · 14 年前

    在ADO.NET上使用导航属性和继承有点问题。

    这是我的数据模型:

    ADO.NET Data Model

    首先,一些词汇:

    Categoria=类别
    Formulario=形式
    Campo=场地
    Imagem=图像
    Paragrafo=段落
    Escolha=选择
    Texto=文本
    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 list返回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 回复  |  直到 14 年前
        1
  •  2
  •   Justin Niessner    14 年前

    我猜您要么使用实体框架1,要么在实体框架4中没有启用延迟加载。

    在您的类中,您希望加载Itens集合。这并不总是这样,因为只有在从数据库检索Formulario对象时显式地预先加载集合时,才会加载该集合。

    您需要添加两行代码,一切都应该顺利:

    if(!Itens.IsLoaded)
        Itens.Load();
    
    List<Item> itens = Itens.ToList();