尝试使用从开发人员构建的现有数据库表派生的模型来解决MVC项目的一些问题,但这些表中没有一个设置了它们的关系(它们都有主键,没有关系)。因此,当需要多个表时,项目使用ViewModels来完成一些事情。
我试图通过添加必要的项目来解决这两个问题。
表1的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);
我收到以下错误消息:
&#34;指定的包含路径无效。 EntityType&#39; X.Table_One&#39; 不会声明一个名为&#39; Table_Two&#39;的导航属性。&#34;
最初这些是通过LINQ查询使用查询语法连接,以便将每个表的属性选择到ViewModel的属性中。
我已经尝试删除了include,但是它并没有与控制器中的其他代码一起使用。我尝试将ICollection更改为IList无济于事。我在这里搜索了其他答案,但似乎没有一个能解决我遇到的问题。
据我所知,启动项目的开发人员使用代码生成工具构建了POCO,该工具是针对项目中的EDMX运行的。此时我唯一能想到的就是让开发人员添加关系,然后更新POCO以通过EDMX提取更新的表。
我还应该指定Table_Two中的ID是Table_One的PROPERTY列中的外键。
答案 0 :(得分:0)
您应该将Include
用于属于相关实体集合的属性
var model = context.Table_Two.Include(t => t.Table_One);
Include
尝试通过在sql查询上使用连接来获取相关实体的集合。
如果要加载相关实体,可以使用延迟加载或使用下面的代码
加载它context.Entry(table_one).Reference(x => x.Table_Two).Load();
答案 1 :(得分:0)
要依赖Entity Framework的related entities loading,您需要设置实体关系。
由于您说“但这些表中没有一个设置了它的关系”,您既不能使用也不能懒惰,也不能手动获取其他实体。