Include语句不适用于LINQ查询
本文关键字:LINQ 查询 适用于 不适用 语句 Include | 更新日期: 2023-09-27 18:27:20
试图使用从开发人员构建的现有数据库表派生的模型来解决MVC项目的一些问题,但这些表都没有设置关系(它们都有主键,只是没有关系)。因此,当需要多个表时,该项目使用ViewModels来完成一些事情。
我试图通过添加必要的项目来关联其中两个表来解决这个问题。
表一的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; }
}
}
如果这些表设置了它们的关系,它们就会在Property值上连接(我已经清理了表名和属性)。据我所知,我已经将事情设置为镜像我一直在处理的另一个项目的方式,该项目具有相关的表,并且已经设置为包括关系,但当我运行这个LINQ查询时:
var model = context.Table_One.Include(t => t.Table_Two);
我收到以下错误消息:
"指定的Include路径无效。EntityType"X.Table_One"未声明名为"Table_Two"的导航属性。"
最初,这些是通过LINQ查询连接的,该查询使用查询语法将表的每个属性选择到ViewModel的属性中。
我试过删除include,但这与控制器中的其他代码不一致。我尝试过将ICollection更改为IList,但没有成功。我在这里搜索了其他答案,但似乎没有一个能解决我的问题。
据我所知,启动该项目的开发人员使用针对项目中的EDMX运行的代码生成工具构建了POCO。在这一点上,我唯一能想到的就是让开发人员添加关系,然后更新POCO,通过EDMX拉入更新的表。
我还应该指定Table_Two中的ID将是Table_One的PROPERTY列中的外键。
您应该将Include
与作为相关实体集合的属性一起使用
var model = context.Table_Two.Include(t => t.Table_One);
Include
试图通过在sql查询上使用联接来获取相关实体的集合。
如果你想加载一个相关的实体,你可以使用惰性加载或使用下面的代码加载它
context.Entry(table_one).Reference(x => x.Table_Two).Load();
要依赖实体框架的相关实体加载,需要设置实体关系。
由于您说了"但这些表都没有设置其关系",您将无法使用或懒惰,也无法急于加载,您必须手动获取其他实体。