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つのコレクションが必要です。コレクションにはプロジェクトが含まれる場合があります。)


ProductEntities.cs


public class ProductEntities : DbContext
{
    public DbSet<Collection> Collections { get; set; }
    public DbSet<Project>    Projects  { get; set; }
}

コントローラ


ProjectController[変更済み]


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

「文字列」のタイプミスは避けてください。

編集

あなたのクラスのために、あなたがコードファーストを使用しているなら(あなたはそうです)

「ForeignKeys」(たとえば、Projectの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+の場合:

私はこれが答えられたことを知っていますが、データベースをリバースエンジニアリングまたはスキャフォールディングするときにEFCoreを使用して同様の問題に直面しました。

この問題は、インデックスに複数のプロパティが含まれている場合に、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は文字列パラメーターを使用できませんでした。これは、EFCoreの新しいリリースで修正されることを願っています。

于 2020-09-27T00:19:07.600 に答える