【发布时间】: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