无法添加从其他类继承的模型控制器

Posted

技术标签:

【中文标题】无法添加从其他类继承的模型控制器【英文标题】: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 【参考方案1】:

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    modelBuilder.Entity<User>();

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

【讨论】:

这和定义 public DbSet UserSet get; 有什么区别?放; 在 DbContext 中? 该集合是在上下文中公开的公共属性。这只是提供给上下文的映射,但两个操作的结果是相同的 - 上下文知道用户实体。 我就是这么想的。但我只是想不出为什么有人更愿意定义映射而不将其作为属性公开的原因。就个人而言,我宁愿使用属性来访问集合而不是泛型方法。

以上是关于无法添加从其他类继承的模型控制器的主要内容,如果未能解决你的问题,请参考以下文章

将协议添加到超类,这将强制从其继承的其他类实现协议

5继承与派生2-访问控制

从父 UIViewController 类继承 UI 组件?

受限 AppDomain 中的 C# 类继承自位于主 AppDomain 中的其他类

模板特化和从其他模板类继承模板类

如何从其他模块向 Django 类添加新方法? [复制]