ASP.NET MVC 3使用模型继承创建控制器

时间:2012-05-01 15:59:38

标签: asp.net-mvc entity-framework inheritance

这个问题是关于Controllers,使用Code First Entity Framework Approach通过Model关联和继承生成的代码。

我有以下模型设置,包含关联和继承。

[Table("User")]
public class User {
  [Key]
  public int UserId { get; set; }
  public string Username { get; set; }
}

[Table("UserProfile")]
public class UserProfile {
  [DatabaseGenerated(DatabaseGeneratedOption.None)]
  [Key, ForeignKey("User")]
  public int UserId { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }

  public virtual User User { get; set; }
}

[Table("Client")]
public class Client : UserProfile {
  public bool Approved { get; set; }
}

然后我在VS2010中生成一个Controller,将模板设置为“具有读/写操作和视图的控制器,使用实体框架”,将模型类设置为“客户端”,将数据上下文类设置为我的上下文类。

这将生成以下索引方法。

public class ClientController : Controller {
  private DataContext db = new DataContext();
  public ViewResult Index() {
    var users = db.UserProfiles.Include(u => u.User);
    return View(users.ToList());
  }
  ...
}

为什么它不像以下那样?

public class ClientController : Controller {
  private DataContext db = new DataContext();
  public ViewResult Index() {
    var users = db.Clients.Include(u => u.User);
    return View(users.ToList());
  }
  ...
}

或许这个?

public class ClientController : Controller {
  private DataContext db = new DataContext();
  public ViewResult Index() {
    var users = db.UserProfiles.OfType<Client>().Include(u => u.User);
    return View(users.ToList());
  }
  ...
}

此外,Create方法使用

db.UserProfiles.Add(client);

我想知道为什么不使用以下内容?

db.Clients.Add(client);

关于我应该使用哪种方法的任何建议?

1 个答案:

答案 0 :(得分:2)

答案在于实体框架如何处理模型中的继承。此方案称为“每个层次结构表”继承。当您运行代码并查看生成的表时,您将看到UserProfile和客户端数据都只存储在一个表中。在此模型中,将使用微分器列来了解什么是类型对象,但这两个数据仅存储在一个表中。因此,对于每个层次结构的方案,控制器存根仅使用基类模型生成。

这可以为您提供更好的见解:

http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx

不确定为什么没有使用OfType(),但似乎VS只生成通用代码。