【问题标题】:Include statement not working with LINQ query包含语句不适用于 LINQ 查询
【发布时间】:2015-12-17 14:15:38
【问题描述】:

尝试使用从开发人员构建的现有数据库表派生的模型来解决 MVC 项目的一些问题,但这些表都没有建立关系(它们都有主键,只是没有关系)。因此,当需要多个表时,该项目使用 ViewModel 来完成一些事情。

我试图通过添加必要的项目来关联两个表来解决这个问题。

Table One 的 POCO:

namespace Project.Models
{
    using System;
    using System.ComponentModel.DataAnnotations;

    public partial class Table_One
    {
        [ScaffoldColumn(false)]
        public short ID { get; set; }

        [Display(Name="Name")]
        public string NAME { get; set; }

        [Display(Name = "Owner")]
        public string OWNER { get; set; }

        [Display(Name = "Property")]
        public Nullable<decimal> PROPERTY { get; set; }

        public virtual Table_Two Table_Two { get; set; }
    }
}

表二的 POCO:

namespace Project.Models
{
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    public partial class Table_Two
    {
        public Table_Two()
        {
            this.Table_One = new HashSet<Table_One>();
        }

        [ScaffoldColumn(false)]
        public short ID { get; set; }

        [Display(Name="Property")]
        [MaxLength(20)]
        public string Property { get; set; }

        public ICollection<Table_One> Table_One { get; set; }
    }
}

如果这些表设置了它们的关系,它们将在属性值上连接(我已经清理了表名称和属性)。据我所知,我已经进行了设置,以反映我一直在处理的另一个项目的方式,该项目具有相关的表,已设置为包含关系,但是当我运行此 LINQ 查询时:

var model = context.Table_One.Include(t => t.Table_Two);

我收到以下错误消息:

"指定的包含路径无效。EntityType 'X.Table_One' 未声明名为“Table_Two”的导航属性。”

最初这些是通过 LINQ 查询连接的,使用查询语法将表的每个属性选择到 ViewModel 的属性中。

我已尝试删除包含,但这与控制器中的其他代码不兼容。我尝试将 ICollection 更改为 IList 无济于事。我在这里搜索了其他答案,但似乎都没有解决我遇到的问题。

据我所知,启动该项目的开发人员使用针对项目中的 EDMX 运行的代码生成工具构建了 POCO。此时我唯一能想到的另一件事是让开发人员添加关系,然后更新 POCO 以通过 EDMX 拉入更新的表。

我还应该指定 Table_Two 中的 ID 是 Table_One 的 PROPERTY 列中的外键。

【问题讨论】:

  • 使用 EF 类作为 MVC 模型是一种不好的做法,您应该考虑改为创建模型。
  • @user449689 我对使用 MVC 还是有点陌生​​,所以我不太清楚你的意思。
  • 马特,看看这个问题:stackoverflow.com/questions/3918938/…
  • @user449689 啊,我明白你的意思了,虽然你链接的文章已经很老了,而且显然有更新的方法可以防止在最新版本的 MVC 中过度发布。 odetocode.com/blogs/scott/archive/2012/03/11/…
  • 酷,感谢您的链接

标签: c# .net linq asp.net-mvc-4 entity-framework-5


【解决方案1】:

您应该将Include 与作为相关实体集合的属性一起使用

var model = context.Table_Two.Include(t => t.Table_One);

Include 尝试通过在 sql 查询中使用连接来获取相关实体的集合。

如果要加载相关实体,可以使用延迟加载或使用下面的代码加载它

context.Entry(table_one).Reference(x => x.Table_Two).Load();

【讨论】:

  • 使用您的第二个解决方案,使用 Entry 方法,我收到以下错误:“Project.Models.Table_One”是“类型”,但用作“变量”。也许我太从字面上遵循你的代码了?
  • table_one 应该是Table_One 的一个实例。您已经从数据库中获取的条目
【解决方案2】:

要依赖Entity Framework的related entities loading,需要设置实体关系。

既然你说“但是这些表都没有建立它的关系”,你将不能使用也不能延迟加载,你必须手动获取其他实体。

【讨论】:

  • 我认为在这种情况下,关系是由 EF 按照约定自动生成的。
  • @dotctor 怎么样?他向我们展示的模型中没有外键。
  • @Albireo 在我的另一个项目中,Include 语句起作用,我只有带有 Key 注释的主键设置,但没有外键设置。如果我的措辞不够清楚,我的代码中的模型是从现有的数据库表中生成的,它们没有先编码然后用于创建数据库表。我们一直在使用 EF 5.x DbContext Generator 从生成的 EDMX 中的选定表中生成上下文和模型。
  • @MattD 你不必这样做,如果你遵守约定。这意味着在主体实体中有一个int Id(我认为 int)属性和一个virtual ICollection&lt;DependantEntity&gt; Dependants属性和一个PrincipalEntity PrincipalEntityId属性(其中PrincipalEntity是类的名称委托人)在从属实体中。如果您这样做,实体框架将为您设置关系。 (可能有几个变化,现在不记得了,检查文档。)
  • @Albireo 我不必...什么?从数据库生成我的模型?
猜你喜欢
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2017-10-17
  • 2021-02-23
  • 2015-01-03
  • 2010-10-01
  • 1970-01-01
相关资源
最近更新 更多