在视图中调用模型中的模型。 (asp.net MVC)

时间:2015-08-03 17:28:25

标签: c# asp.net asp.net-mvc database entity-framework

请记住,我是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的生成器也存在于数据库中。

我确实手动将值放在数据库中,是什么导致它?

任何形式的帮助都非常感谢! :)

2 个答案:

答案 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:

指定include
public 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