Asp.net mvc 3 如何首先在ASP.NET MVC 3和EF 4.1代码中使用导航属性(/外键)

Asp.net mvc 3 如何首先在ASP.NET MVC 3和EF 4.1代码中使用导航属性(/外键),asp.net-mvc-3,ef-code-first,entity-framework-4.1,Asp.net Mvc 3,Ef Code First,Entity Framework 4.1,我首先开始使用EF代码测试“工作流”。 首先,我创建了类图。设计了几个类- 然后我首先使用了EF代码,创建了EntsContext public class EntsContext : DbContext { public DbSet<Project> Projects { get; set; } public DbSet<Phase> Phases { get; set; } public DbSet<

我首先开始使用EF代码测试“工作流”。
首先,我创建了类图。设计了几个类-
然后我首先使用了EF代码,创建了EntsContext

    public class EntsContext : DbContext
    {
        public DbSet<Project> Projects { get; set; }
        public DbSet<Phase> Phases { get; set; }
        public DbSet<Iteration> Iterations { get; set; }
        public DbSet<Task> Tasks { get; set; }
        public DbSet<Member> Members { get; set; }
    }
问题是:我没有看到项目经理(列出/创建使用的脚手架)。我想知道我是否做得不对,或者脚手架生成只是忽略了我的属性,这些属性不是基本类型。
隐马尔可夫模型。。。这可能很明显。。因为生成器不知道应该使用那种类型的属性,对吗


那么我可以稍微修改一下我的问题:在这个场景中创建项目实体的可靠方法是什么(我想在项目创建期间选择一个项目经理)?我应该为此创建一个ViewModel吗?

我认为您需要一个ProjectManager类,并且您的项目实体需要有一个指向ProjectManager类的属性

比如:

public class Project
{
   public string Description {get; set;}
   public Member ProjectManager {get; set;}
}

默认情况下,
ProjectManager
不会加载。必须使用延迟加载或快速加载。当您查询
项目时,将加载
ProjectManager

public ActionResult Index()
{
    using (var db = new EntsContext())
    {
        return View(db.Projects.Include(p => p.ProjectManager).ToList());
    }
}
在视图中访问属性后,延迟加载将加载
ProjectManager
。要允许延迟加载,您必须将所有导航属性创建为
virtual
,但在您当前的场景中,这并不好,因为:

  • 延迟加载需要打开上下文。在呈现视图之前关闭上下文,这样将获得已处置上下文的异常
  • 在您的案例中,延迟加载会导致对DB的N+1查询,其中N是项目数,因为每个项目的经理都将被单独查询

在控制器中,您将返回项目列表。您的项目类看起来像什么?您可以在包含类图的链接图像中看到该类。假设他的项目类看起来像您描述的。如何让自动生成的视图通过文本框或其他方式显示“Member”属性?我总是手动执行此操作,因为向导似乎无法为您执行此操作。一旦你开始进入更复杂的类,你不能期望IDE深入到每一个属性并生成一个文本框,可以吗?检查链接的类图图像。我相信我已经明白了。谢谢,只是稍微修改一下。。Include()只接受字符串输入—属性的名称,所以我将其改写为:`Include(“ProjectManager”)。也谢谢你给我的提示,为什么不在我的情况下懒加载。
public ActionResult Index()
{
    using (var db = new EntsContext())
    {
        return View(db.Projects.Include(p => p.ProjectManager).ToList());
    }
}