使用ASP.NET Core 2.0,Entity Framework Core和Visual Studio,我试图在剃刀视图中使用@foreach循环来呈现List" SecondEntityList"在Entity1模型中。我能够使用Entity Framework Core使用另一个视图和操作方法将数据保存到SQL Server本地DB。数据保存在dbo.Entity1和dbo.Entity2表中。
访问剃刀视图以列出相关实体列表会返回以下错误:
NullReferenceException: Object reference not set to an instance of an object.
如何使用@foreach循环来渲染" SecondEntityList"在Entity1中?
实体1
using System.Collections.Generic;
namespace Project.Models
{
public class Entity1
{
public int Entity1Id { get; set; }
public List<Entity2> SecondEntityList { get; set; }
}
}
实体2
namespace Project.Models
{
public class Entity2
{
public int Entity2Id { get; set; }
public string Text { get; set; }
public int Entity1Id { get; set; }
public Entity1 Entity1 { get; set; }
}
}
查看模型
using System.Collections.Generic;
namespace Project.Models.ViewModels
{
public class MyViewModel
{
public Entity1 Entity1 = new Entity1();
public IEnumerable<Project.Models.Entity2> Entity2List;
}
}
行动方法
[HttpGet]
public IActionResult MyListView(long key, MyViewModel mvm)
{
mvm.Entity1 = context.Entity1.Single(i => i.Entity1Id == key);
mvm.Entity2List = mvm.Entity1.SecondEntityList;
return View(mvm);
}
Razor查看
@model Sediment.Models.ViewModels.MyViewModel;
@foreach (Project.Models.Entity2 i in Model.Entity2List)
{
@i.Text
}
答案 0 :(得分:1)
出于多种原因,在视图中使用实体模型是不好的做法。但 是一种在查询中使用.Include(...)
执行所要求的方法。
mvm.Entity1 =
context.Entity1
.Include(i => i.SecondEntityList)
.Single(i => i.Entity1Id == key);
如果这是一个严肃的项目,并且您希望将此代码保留一段时间,我强烈建议您将您的视图问题与数据库分开。 否则,在放置db上下文后,您可能最终会尝试在剃刀视图中执行查询。在你可能遇到的许多其他错误中。