1

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

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

以下是 Man 类:

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; }
}

此外,我确实在我的控制器中使用了 OfType 并这样查看:

//
    // 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);
    }

在视图中:

 @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>

顺便说一句,我从来没有提到过DbSet<User>while 提到的DbSet<Man>. 原因; EF 将创建一张表,其中包含 User 和 Man 的所有属性,称为 Man 表。可以使用 Discriminator 列区分不同的继承类,例如 Customer(本问题中未提及)和 User。

对不起,如果故事变得很长,但是我该如何处理呢?也就是说,我怎样才能在视图中拥有用户属性?我是否必须将它们添加到自己身上,但如果是这样,我将无法访问它们,因为会分散一些 DisplayFor() 包含在创建数据输入表单的 foreeach 循环中。

希望我能成功转移问题..有人可以帮我吗?问候,

4

1 回答 1

0

看起来您正在尝试为每个层次结构映射做一个表。您可能需要根据鉴别器值定义到 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));

     }

}

然后您的存储库可以查询用户的上下文并将用户对象返回到视图。将视图更改为@model IList<User>,您应该能够将 User 与 Man 属性一起使用。您可以映射其他类型,例如modelBuilder.Entity<Man>().Map<Customer>(c => c.Requires("UserTypeId").HasValue(2)

我假设您使用的是 EF 5,并且有一个名为 UserTypeId 的鉴别器列。

希望有帮助!

于 2013-05-27T04:53:44.560 回答