【问题标题】:Can't add controller of model that inherits from other class无法添加从其他类继承的模型控制器
【发布时间】:2012-05-26 21:01:37
【问题描述】:

我正在使用 Entity Framework 和 MVC3,我的问题是如果模型继承自另一个类,我无法构建控制器。

例子:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class User : Person
{
    public string Email { get; set; }
    public string Password { get; set; }
}

public class Context : DbContext
{
    public DbSet<Person> PersonSet { get; set; }
}

当我尝试使用模板 Controller with read/write actions and views, using Entity Framework 添加控制器 User 时,我收到此错误:

“用户”不是指定的“上下文”类的一部分,无法修改“上下文”类以向其添加“DbSet”属性。 (例如,'Context' 类可能在已编译的程序集中。)

我可以将public DbSet&lt;User&gt; UserSet { get; set; } 添加到Context,但我认为这不是正确的方法。

【问题讨论】:

  • 如果不将User添加到DbContext中,你将把Email和Password存放在哪里?
  • 通过将 PersonSet 添加到上下文中,我可以通过 context.PersonSet.OfType&lt;User&gt;() 获得用户列表
  • @vicentedealencar ,我遇到了同样的错误,你是怎么解决的?这是我的问题MyQuestion

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


【解决方案1】:

目前您的User 不是持久类型,因为上下文不知道该类型,因此您不能使用持久实体类型的脚手架来为User 类型创建控制器。如果您想在数据库中存储 User 及其属性,请将其添加到您的上下文中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>();
}

如果您不想将User 持久化到数据库,则不能使用脚手架创建控制器。

【讨论】:

  • 这和定义 public DbSet UserSet { get; 有什么区别?放; } 在 DbContext 中?
  • 该集合是在上下文中公开的公共属性。这只是提供给上下文的映射,但两个操作的结果是相同的 - 上下文知道用户实体。
  • 我就是这么想的。但我只是想不出为什么有人更愿意定义映射而不将其作为属性公开的原因。就个人而言,我宁愿使用属性来访问集合而不是泛型方法。
猜你喜欢
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多