【问题标题】:How to work with navigation properties (/foreign keys) in ASP.NET MVC 3 and EF 4.1 code first如何首先在 ASP.NET MVC 3 和 EF 4.1 代码中使用导航属性(/外键)
【发布时间】:2011-03-28 23:54:06
【问题描述】:

我首先开始使用 EF 代码测试“工作流程”。
首先,我创建了类图。设计了几个类 - you can see class diagram here
然后我使用 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 吗?

【问题讨论】:

  • 在您的控制器中,您将返回一个项目列表。你的项目类是什么样的?
  • 您可以在包含类图的链接图像中看到该类。

标签: asp.net-mvc-3 ef-code-first entity-framework-4.1


【解决方案1】:

ProjectManager 默认不会加载。您必须使用延迟加载或急切加载。当您查询Projects 时,渴望加载将加载ProjectManager

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

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

  • 延迟加载需要打开上下文。您在视图呈现之前关闭上下文,因此您将获得处置上下文的异常。
  • 在您的情况下,延迟加载会导致对 DB 进行 N+1 次查询,其中 N 是项目数,因为将分别查询每个项目的经理。

【讨论】:

  • 谢谢,只是一个小的修改。Include() 只接受字符串输入 - 属性名称,所以我将其重写为:`Include("ProjectManager")。还要感谢提示为什么不延迟加载在我的情况下。
【解决方案2】:

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

类似:

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

【讨论】:

  • 假设他的 Project 类看起来像你描述的那样。您如何获得自动生成的视图以通过文本框或其他方式显示“成员”属性?我总是手动执行此操作,因为向导似乎无法为您执行此操作。一旦您开始进入更复杂的类,您就不能期望 IDE 深入到每个属性并生成一个文本框,对吗?
  • 检查链接的类图图像。我已经相信了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多