请记住,我是ASP.NET MVC的新手。所以使用EF代码第一种方法,我创建了两个模型,电影和制作人:
public class Movie {
public int ID {get;set;}
public string Name {get;set;}
public string Genre {get;set;}
public Producer Producer {get;set;}
}
public class Producer {
public int ID {get;set;}
public string Name {get;set;}
public DateTime DOB {get;set;}
public List<Movie> Movies {get;set;}
}
在控制器类“电影”中,我调用了一个视图:
public class MoviesController : Controller
{
//context just has DbSet< .. > of both classes.
MoviesContext db = new MoviesContext();
public ActionResult Index()
{
var movies = from m in db.Movies
select m;
return View(movies.ToList());
}
}
但是如果我在视图中调用生产者
@foreach(var item in Model)
{
<p>@item.Producer.Name</p>
}
MVC崩溃,“对象引用未设置为对象的实例”。错误,即使我查看数据库时,也填写了Producer_ID字段(代码首次编写),并且所有具有相应ID的生成器也存在于数据库中。
我确实手动将值放在数据库中,是什么导致它?
任何形式的帮助都非常感谢! :)
答案 0 :(得分:3)
尝试通过调用函数Producer
Include()
数据
public ActionResult Index()
{
var movies = from m in db.Movies.Include(b => b.Producer)
select m;
return View(movies.ToList());
}
如果启用了延迟加载,则会在第一次需要时加载您的属性Producer
。但是,如果禁用延迟加载,则需要明确指定要加载其他相关实体。
方法Include
that accepts a lambda是一种扩展方法,因此您需要在文件顶部添加此方法:
using System.Data.Entity;
替代方法是使用string:
指定includepublic ActionResult Index()
{
var movies = from m in db.Movies.Include("Producer")
select m;
return View(movies.ToList());
}
结果相同,但第一种方法不包含“魔术字符串”,这通常更可取。
答案 1 :(得分:1)
这是错误的,只是在返回之前放一个断点并检查movies.Producer是否为空,我击败了是.. 你需要像这样包括生产者:
var movies = from m in db.Movies.Include(m => m.Producer)
或者也许与Producer表进行连接,请参阅3表连接示例(在您的情况下仅为2)here