C# 使用EF代码优先和MVC3为衍生模型创建控制器

C# 使用EF代码优先和MVC3为衍生模型创建控制器,c#,asp.net-mvc-3,ef-code-first,C#,Asp.net Mvc 3,Ef Code First,我想知道如何为派生模型生成控制器。让我给你一个大局。有一个人类继承了用户类。正如我在几篇EF教程中所读到的,我并没有在DatabaseContext类中定义DbSet。因此,您可能知道,在SQL上只会生成一个表,该表除了一个鉴别器列之外,还包含Man和User类的所有属性 当我试图为用户找出一个控制器类时,出现了这个问题,但由于DatabaseContext中没有提到它,MVC无法创建它,最终导致了一个错误。因此,我为Man类创建了一个控制器,即父类。我还在控制器中做了一些修改,以明确地指向用户

我想知道如何为派生模型生成控制器。让我给你一个大局。有一个类继承了用户类。正如我在几篇EF教程中所读到的,我并没有在DatabaseContext类中定义DbSet。因此,您可能知道,在SQL上只会生成一个表,该表除了一个鉴别器列之外,还包含Man和User类的所有属性

当我试图为用户找出一个控制器类时,出现了这个问题,但由于DatabaseContext中没有提到它,MVC无法创建它,最终导致了一个错误。因此,我为Man类创建了一个控制器,即父类。我还在控制器中做了一些修改,以明确地指向用户。我的意思是,使用类型和类型。但是当我来到基于MVC脚手架创建的视图时,我找不到任何用户属性,那些专用于这个类的属性

以下是男子级别:

public class Man
{
    [Key]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
    public long ID { get; set; }
    //------------------------------------------------------------//
    [Required, MaxLength(20)]
    [LocalizedAttribute("FName")]
    public string FName { get; set; }
    //------------------------------------------------------------//
    [Required, MaxLength(20)]
    [LocalizedAttribute("LastName")]
    public string LastName { get; set; }
    //------------------------------------------------------------//
    [Required]
    [RegularExpression("^[0-9]+$", ErrorMessageResourceName = "ErrorOnlyNumbers", ErrorMessageResourceType = typeof(MAHAL_E_MA_Model.Properties.Resources))]
    [LocalizedAttribute("Mobile")]
    public string Mobile { get; set; }
    //------------------------------------------------------------//
    [LocalizedAttribute("Phone")]
    [RegularExpression("^[0-9]+$", ErrorMessageResourceName = "ErrorOnlyNumbers", ErrorMessageResourceType = typeof(MAHAL_E_MA_Model.Properties.Resources))]
    public string HomePhone { get; set; }
    //------------------------------------------------------------//
    [RegularExpression("^[0-9]+$")]
    [LocalizedAttribute("IDCardNumber")]
    public string IDCardNumber { get; set; }
    //------------------------------------------------------------//
    [RegularExpression("^[0-9]+$")]
    [LocalizedAttribute("NationalCode")]
    public string NationalCode { get; set; }
    //------------------------------------------------------------//
    [MaxLength(10)]
    [LocalizedAttribute("DOB")]
    public int DOB { get; set; }
    //------------------------------------------------------------//
    [Required]
    public int CityID { get; set; }
    [ForeignKey("CityID")]
    public virtual City CityParent { get; set; }
    //------------------------------------------------------------//
    [MaxLength(100)]
    [LocalizedAttribute("Address")]
    public string Address { get; set; }
    //------------------------------------------------------------//
    [LocalizedAttribute("PostalCode")]
    public string PostalCode { get; set; }
    //------------------------------------------------------------//
    [MaxLength(255)]
    [LocalizedAttribute("PhotoPath")]
    public string PhotoPath { get; set; }
}
下面是用户类:

public class User : Man
{
    [MaxLength(20)]
    [LocalizedAttribute("Username")]
    public string UserName { get; set; }
    //------------------------------------------------------------//
    [DataType(DataType.Password)]
    [MaxLength(100), MinLength(6, ErrorMessageResourceType = typeof(MAHAL_E_MA_Model.Properties.Resources), ErrorMessageResourceName = "ErrorPasswordLength")]
    [LocalizedAttribute("Password")]
    public string Password { get; set; }
    //------------------------------------------------------------//
    [DataType(DataType.Password)]
    [Compare("Password", ErrorMessageResourceType = typeof(MAHAL_E_MA_Model.Properties.Resources), ErrorMessageResourceName = "ErrorConfirmPassword")]
    [LocalizedAttribute("ConfirmPassword")]
    public string ConfirmPassword { get; set; }
    //------------------------------------------------------------//
    [DataType(DataType.EmailAddress, ErrorMessageResourceType = typeof(MAHAL_E_MA_Model.Properties.Resources), ErrorMessageResourceName = "ErrorEmailInvalid")]
    [MaxLength(20)]
    [RegularExpression(@"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}")]
    [LocalizedAttribute("Email")]
    public string Email { get; set; }
    //------------------------------------------------------------//
    [MaxLength(30)]
    [LocalizedAttribute("Title")]
    public string Title { get; set; }
    //------------------------------------------------------------//
    [MaxLength(10)]
    [LocalizedAttribute("HireDate")]
    public int HireDate { get; set; }
    //------------------------------------------------------------//
    [LocalizedAttribute("ReportsTo")]
    public long ReportsTo { get; set; }
    [ForeignKey("ReportsTo")]
    public virtual IList<User> ReportsChild { get; set; }
}
公共类用户:Man
{
[MaxLength(20)]
[本地化属性(“用户名”)]
公共字符串用户名{get;set;}
//------------------------------------------------------------//
[数据类型(数据类型.密码)]
[MaxLength(100),MinLength(6,ErrorMessageResourceType=typeof(MAHAL_E_MA_Model.Properties.Resources),ErrorMessageResourceName=“ErrorPasswordLength”)]
[本地化属性(“密码”)]
公共字符串密码{get;set;}
//------------------------------------------------------------//
[数据类型(数据类型.密码)]
[比较(“密码”,ErrorMessageResourceType=typeof(MAHAL_E_MA_Model.Properties.Resources),ErrorMessageResourceName=“ErrorConfirmPassword”)]
[本地化属性(“确认密码”)]
公共字符串ConfirmPassword{get;set;}
//------------------------------------------------------------//
[数据类型(DataType.EmailAddress,ErrorMessageResourceType=typeof(MAHAL_E_MA_Model.Properties.Resources),ErrorMessageResourceName=“ErrorEmailInvalid”)]
[MaxLength(20)]
[正则表达式(@“[a-zA-Z0-9.\%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}”)]
[本地化属性(“电子邮件”)]
公共字符串电子邮件{get;set;}
//------------------------------------------------------------//
[MaxLength(30)]
[本地化属性(“标题”)]
公共字符串标题{get;set;}
//------------------------------------------------------------//
[MaxLength(10)]
[本地化属性(“HireDate”)]
public int HireDate{get;set;}
//------------------------------------------------------------//
[本地化属性(“ReportsTo”)]
公共长报告{get;set;}
[外键(“报告”)]
公共虚拟IList ReportsChild{get;set;}
}
此外,我确实在控制器和视图中使用了类型:

//
    // GET: /User/

    public ViewResult Index()
    {
        //var mans = db.Mans.Include(m => m.CityParent);
        return View(unitOfWork.UserRepository.Get(orderBy: us => us.OrderByDescending(u => u.ID)).OfType<User>().ToList());
    }

 // POST: /User/Create

    [HttpPost]
    public ActionResult Create(Man man)
    {
        if (ModelState.IsValid)
        {
            //db.Mans.Add(man);
            //db.SaveChanges();
            MAHAL_E_MA_Model.POCO.User user = (MAHAL_E_MA_Model.POCO.User)man;
            unitOfWork.UserRepository.InsertData(user);
            unitOfWork.UserRepository.Save();
            return RedirectToAction("Index");  
        }

       // ViewBag.CityID = new SelectList(db.Cities, "CityID", "Name", man.CityID);
        return View(man);
    }
//
//获取:/User/
公共视图结果索引()
{
//var mans=db.mans.Include(m=>m.CityParent);
返回视图(unitOfWork.UserRepository.Get(orderBy:us=>us.OrderByDescending(u=>u.ID)).OfType().ToList();
}
//POST:/User/Create
[HttpPost]
公共行动结果创建(人-人)
{
if(ModelState.IsValid)
{
//db.Mans.Add(man);
//db.SaveChanges();
MAHAL_E_MA_Model.POCO.User=(MAHAL_E_MA_Model.POCO.User)man;
unitOfWork.UserRepository.InsertData(用户);
unitOfWork.UserRepository.Save();
返回操作(“索引”);
}
//ViewBag.CityID=新的选择列表(db.Cities,“CityID”,“Name”,man.CityID);
返回视图(man);
}
并且认为:

 @foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.FName.OfType<MAHAL_E_MA_Model.POCO.User>())
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LastName.OfType<MAHAL_E_MA_Model.POCO.User>())
        </td>

        <td>
            @Html.DisplayFor(modelItem => item.Mobile.OfType<MAHAL_E_MA_Model.POCO.User>())
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.HomePhone.OfType<MAHAL_E_MA_Model.POCO.User>())
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.IDCardNumber.OfType<MAHAL_E_MA_Model.POCO.User>())
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.NationalCode.OfType<MAHAL_E_MA_Model.POCO.User>())
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.DOB)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CityParent.Name.OfType<MAHAL_E_MA_Model.POCO.User>())
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Address.OfType<MAHAL_E_MA_Model.POCO.User>())
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PostalCode.OfType<MAHAL_E_MA_Model.POCO.User>())
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PhotoPath.OfType<MAHAL_E_MA_Model.POCO.User>())
        </td>
        <td>
            @Html.ActionLink(GeneralResource.Edit, "Edit", new { id = item.ID }) |
            @Html.ActionLink(GeneralResource.ViewDetails, "Details", new { id = item.ID }) |
            @Html.ActionLink(GeneralResource.Delete, "Delete", new { id = item.ID })
        </td>
    </tr>
@foreach(模型中的变量项)
{
@DisplayFor(modelItem=>item.FName.OfType())
@DisplayFor(modelItem=>item.LastName.OfType())
@DisplayFor(modelItem=>item.Mobile.OfType())
@DisplayFor(modelItem=>item.HomePhone.OfType())
@DisplayFor(modelItem=>item.IDCardNumber.OfType())
@DisplayFor(modelItem=>item.NationalCode.OfType())
@DisplayFor(modeleItem=>item.DOB)
@DisplayFor(modelItem=>item.CityParent.Name.OfType())
@DisplayFor(modelItem=>item.Address.OfType())
@DisplayFor(modelItem=>item.PostalCode.OfType())
@DisplayFor(modelItem=>item.PhotoPath.OfType())
@ActionLink(GeneralResource.Edit,“Edit”,新的{id=item.id})|
@ActionLink(GeneralResource.ViewDetails,“Details”,新的{id=item.id})|
@ActionLink(GeneralResource.Delete,“Delete”,new{id=item.id})
顺便说一句,我从来没有提到过
DbSet
,而提到了
DbSet
。原因是;EF将创建一个表,其中包含名为Man table的User和Man的所有属性。可以使用Discriminator列来区分不同的继承类,例如Customer(本问题中未提及)和User

很抱歉,如果故事太长,我该如何处理它?也就是说,我如何才能在视图中拥有用户属性?我是否必须自己添加它们,但如果是这样,我将无法访问它们,因为在创建数据输入表单的Foreach循环中包含了一些DisplayFor()

希望我能成功地解决这个问题。。 有人能帮我吗?
关于,

看起来您正在尝试按层次结构进行表映射。您可能需要根据鉴别器值定义到Man的映射:

   public class MyDbContext: DbContext
   {
     // Constructor here


     public DbSet<Man> Man {get;set;} 

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
         modelBuilder.Entity<Man>().Map<User>(c => c.Requires("UserTypeId").HasValue(1));

     }

}