我已经阅读了很多关于使用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:
结果是让控制器获得Person
类的索引,详细信息,创建,删除,编辑操作。
所有Persons
包括Employees
的{{1}}都会显示在Index.cshtml
列表中。在Details.cshtml
视图中,员工Salary
将不会显示。在Edit.cshtml
视图中,无法编辑员工Salary
(它不可见)。 此外 POST Edit
操作无法(可以吗?)绑定Salary
,具体取决于编辑Person
xor Employee
。这可以预测,这有点明显,但如何解决这个问题?
主要问题:
我应该为每种类型Person
和Employee
创建一个控制器,还是只为它们创建一个控制器?
我应该为每种类型创建一个详细信息,创建,删除,编辑视图,还是仅创建一个,并以某种方式检查这些视图中我想要在视图中呈现/编辑/创建的对象类型?如果我想让一个控制器如何解决POST Edit
动作方法中的绑定?
如果有一个索引页面,其中列表包含Person
,Employee
对象,则如何检查视图列表中的对象类型导航到右侧详细信息,创建,删除,编辑视图?
我想到的示例解决方案:创建两个控制器PersonController
,EmployeeController
包含所有视图,Index
视图和EmployeeController
操作除外。然后基于index.cshtml列表中的对象类型导致不同的视图。