1

我首先开始使用 EF 代码测试“工作流程”。
首先,我创建了类图。设计了几个类 -你可以在这里看到类图
然后我使用 EF Code First,创建了 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; }
    }

下一步是通过简单的操作创建一个 ProjectController (ASP.NET MVC3):

public ActionResult Index()
{
    using (var db = new EntsContext())
    {
        return View(db.Projects.ToList());
    }
}

问题是:我没有看到 ProjectManager(使用了列出/创建脚手架)。我想知道我做错了还是脚手架生成只是忽略了我的属性,这些属性不是基本类型。
嗯......这可能很明显......因为生成器不知道应该使用该类型的什么属性,对吧?

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

4

2 回答 2

3

ProjectManager默认情况下不会加载。您必须使用延迟加载或急切加载。ProjectManager查询时将加载急切加载Projects

public ActionResult Index()
{
    using (var db = new EntsContext())
    {
        return View(db.Projects.Include(p => p.ProjectManager).ToList());
    }
}

ProjectManager一旦在视图中访问属性,就会加载延迟加载。要允许延迟加载,您必须创建所有导航属性,virtual但在您当前的情况下,这不是很好的方法,因为:

  • 延迟加载需要打开上下文。您在呈现视图之前关闭上下文,因此您将获得已处置上下文的异常。
  • 在您的情况下,延迟加载会导致对 DB 的 N+1 查询,其中 N 是项目数,因为每个项目的经理将被单独查询。
于 2011-03-29T05:57:59.287 回答
0

我相信您将需要一个 ProjectManager 类,并且您的 Project 实体将需要一个指向 ProjectManager 类的属性。

就像是:

public class Project
{
   public string Description {get; set;}
   public Member ProjectManager {get; set;}
}
于 2011-03-29T00:13:22.773 回答