【问题标题】:ASP.NET MVC 3 Creating a Controller with Model InheritanceASP.NET MVC 3 创建具有模型继承的控制器
【发布时间】:2012-05-02 04:30:06
【问题描述】:

这个问题是关于控制器,即使用代码优先实体框架方法通过模型关联和继承生成的代码。

我有以下具有关联和继承的模型设置。

[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 中生成一个控制器,将模板设置为“具有读/写操作和视图的控制器,使用实体框架”,将模型类设置为“客户端”,将数据上下文类设置为我的上下文类。

这会生成以下 Index 方法。

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);

关于我应该使用哪种方法有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

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

    这可以给你更好的洞察力:

    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只生成通用代码。

    【讨论】:

    • 在这种情况下,由于继承,我应该使用 db.UserProfiles.OfType().Include(u => u.User) 和 db.UserProfiles.Add(client)?
    • 不,您只使用 db.Client.Add(client),这没有问题,但数据将仅存储在单个表“UserProfiles”中,其中包含鉴别符“client” .这一切都是自动发生的。您可以同时使用 db.UserProfiles.OfType 或 db.client ,两者都将返回相同的结果。 Visual Studio 生成的代码是因为一些内部限制。对开发者没有这样的限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多