我是否应该为ASP.NET-MVC中的TPH继承层次结构创建一个或多个视图和控制器

时间:2014-12-12 18:45:47

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

我已经阅读了很多关于使用Entity Framework进行继承的文章(在ASP.NET-MVC上下文中),每个人都在撰写有关数据库问题的一面,但没有人提出问题的观点方面

我们得到了模型类:

public class Person {
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}
public class Employee : Person {
    public int? Salary { get; set; }
}

并在我们持有的dbContext中:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> {

    public DbSet<Person> Persons { get; set; }

    public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) {
        Configuration.LazyLoadingEnabled = true;
        Configuration.ProxyCreationEnabled = true;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

    public static ApplicationDbContext Create() {
        return new ApplicationDbContext();
    }
}

其他问题:我还要在dbContext中保留public DbSet<Employee> Employees { get; set; }吗?

现在如果我点击Controllers目录右键单击,然后像这样添加Controller:

enter image description here

结果是让控制器获得Person类的索引,详细信息,创建,删除,编辑操作。

所有Persons包括Employees的{​​{1}}都会显示在Index.cshtml列表中。在Details.cshtml视图中,员工Salary将不会显示。在Edit.cshtml视图中,无法编辑员工Salary(它不可见)。 此外 POST Edit操作无法(可以吗?)绑定Salary,具体取决于编辑Person xor Employee。这可以预测,这有点明显,但如何解决这个问题?

主要问题:

我应该为每种类型PersonEmployee创建一个控制器,还是只为它们创建一个控制器?

我应该为每种类型创建一个详细信息,创建,删除,编辑视图,还是仅创建一个,并以某种方式检查这些视图中我想要在视图中呈现/编辑/创建的对象类型?如果我想让一个控制器如何解决POST Edit动作方法中的绑定?

如果有一个索引页面,其中列表包含PersonEmployee对象,则如何检查视图列表中的对象类型导航到右侧详细信息,创建,删除,编辑视图?

我想到的示例解决方案:创建两个控制器PersonControllerEmployeeController包含所有视图,Index视图和EmployeeController操作除外。然后基于index.cshtml列表中的对象类型导致不同的视图。

0 个答案:

没有答案