1

我正在尝试在索引页面上获取项目列表 - 但我不断收到错误。我尝试了不同的代码,下面是我尝试过的最新代码 - 但它仍然无法正常工作。它给了我这个错误:

System.InvalidOperationException:指定的包含路径无效。EntityType 'StoreWeb.Models.Project' 未声明名为 'Collections' 的导航属性

我认为这是因为我不知道如何从 Project 表中获取 collectionID。对于 Project 表,它有 collectionID 作为外键。(一个项目必须有 1 个集合。一个集合可能有项目。)

有人可以帮帮我吗?这是我所拥有的:

楷模


Collection.cs [修改]


[Table("Collection")]
public class Collection
{
    [Key]
    public string collectionID { get; set; }
    public string collectionName { get; set; }

    public List<Project> Projects { get; set; }
}

Project.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; }
}

对于 Project 类,它的 collectionID 作为外键。(一个项目必须有 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);
    }

意见


视图/项目/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> 
     }
4

2 回答 2

3

只是一个错字

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);

您将避免“字符串”拼写错误。

编辑

对于您的课程,如果您使用的是 code First(您是)

删除“ForeignKeys”(例如项目中的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; }
}
于 2012-06-04T08:32:29.940 回答
0

注意:对于 EF CORE 3+ 或 5+:

我知道这已得到解答,但在逆向工程或搭建数据库时,我使用 EF Core 遇到了类似的问题:

当我在索引中涉及多个属性时,这个问题在我的 DbContext 中的索引上出现了包含属性。

在我的 OnModelCreating 方法中从 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 中得到修复。

于 2020-09-27T00:19:07.600 回答