Asp.net mvc 3 如何首先在ASP.NET MVC 3和EF 4.1代码中使用导航属性(/外键)
我首先开始使用EF代码测试“工作流”。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代码,创建了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());
}
}