System.InvalidOperationException:指定的包含路径无效
本文关键字:包含 路径 无效 InvalidOperationException System | 更新日期: 2023-09-27 18:36:08
我试图在索引页面上获取项目列表 - 但我不断收到错误。我尝试了不同的代码,以下是我尝试过的最新代码 - 但它仍然不起作用。它给了我这个错误:
System.InvalidOperationException:指定的包含路径无效。实体类型"StoreWeb.Models.Project"不声明名为"集合"的导航属性
我想这是因为我不知道如何从项目表中获取集合ID。对于项目表,它具有集合 ID 作为外键。(一个项目必须有 1 个集合。集合可以包含项目。
有人可以帮我吗?这是我所拥有的:
模型
收藏.cs [修改]
[Table("Collection")]
public class Collection
{
[Key]
public string collectionID { get; set; }
public string collectionName { get; set; }
public List<Project> Projects { get; set; }
}
项目.cs [修改]
[Table("Project")]
public class Project
{
[Key]
public string projectID { get; set; }
public string projectName { get; set; }
public string projectCity { get; set; }
public string collectionID { get; set; } // This is what was needed!
public virtual Collection Collection { get; set; }
}
对于类项目,它具有集合 ID 作为外键。(一个项目必须有 1 个集合。集合可以包含项目。
产品实体.cs
public class ProductEntities : DbContext
{
public DbSet<Collection> Collections { get; set; }
public DbSet<Project> Projects { get; set; }
}
控制器
项目控制器 [已修改]
using System.Data.Entity;
public class ProjectController : Controller
{
ProductEntities productDB = new ProductEntities();
//
// GET: /Project/
public ActionResult Index()
{
var projectModel = productDB.Projects.Include(m => m.Collection);
return View(projectModel);
}
视图
Views/Project/Index.chtml
@model IEnumerable<StoreWeb.Models.Project>
@{
ViewBag.Title = "Index";
}
<h1>PROJECTS</h1>
@foreach (var project in Model)
{
<br /><a href="@Url.Action("Details", new { id = project.projectID })">@project.projectName</a>
}
只是一个错别字
public ActionResult Index(string project)
{
var projectModel = productDB.Projects.Include("Collection");
return View(projectModel);
}
而不是"集合"
提示(当天)
在您的使用中,添加
using System.Data.Entity;
然后你可以制作
var projectModel = productDB.Projects.Include(m => m.Collection);
您将避免"字符串"拼写错误。
编辑
对于您的类,如果您使用的是代码优先(您是)
删除"外键"(例如,在项目中collection_id),然后执行
//remove the "Bind Exclude"
public class Collection
{
public int Id { get; set; }//make it int, it will be taken as the primary key
public string collectionName { get; set; }
public virtual IList<Project> Projects { get; set; }//make it virtual, lazy loading inside
}
在项目类中
//remove any "collection_Id" property
public class Project
{
public int Id { get; set; }//make it it, rename it, it will be taken as PK
public string projectName { get; set; }
public string projectCity { get; set; }
public virtual Collection Collection { get; set; }
}
注意:对于 EF CORE 3+ 或 5+:
我知道这已经得到了解答,但是在对数据库进行逆向工程或基架时,我在使用 EF Core 时遇到了类似的问题:
当我在索引中涉及多个属性时,这个问题在我的 DbContext 中的索引上出现了包含属性。
在我的OnModelCreate方法中从DB进行逆向工程或脚手架后,我得到了这个:
entity.HasIndex(e => e.BusinessName, "NonClusteredIndex-20190824-150740")
.IncludeProperties(new[] { "Contentid", "Stateid", "Cityid", "businessurl", "UserID" });
然后我把它改成这个
entity.HasIndex(e => e.BusinessName, "NonClusteredIndex-20190824-150740")
.IncludeProperties(bmaster => new { bmaster.Contentid, bmaster.Stateid, bmaster.Cityid, bmaster.Businessurl, bmaster.UserId });
这为我解决了。在这种情况下,EF Core 无法使用字符串参数,我希望这将在新版 EF Core 中修复。