C# 使用EF代码优先和MVC3为衍生模型创建控制器
我想知道如何为派生模型生成控制器。让我给你一个大局。有一个人类继承了用户类。正如我在几篇EF教程中所读到的,我并没有在DatabaseContext类中定义DbSet。因此,您可能知道,在SQL上只会生成一个表,该表除了一个鉴别器列之外,还包含Man和User类的所有属性 当我试图为用户找出一个控制器类时,出现了这个问题,但由于DatabaseContext中没有提到它,MVC无法创建它,最终导致了一个错误。因此,我为Man类创建了一个控制器,即父类。我还在控制器中做了一些修改,以明确地指向用户。我的意思是,使用类型和类型。但是当我来到基于MVC脚手架创建的视图时,我找不到任何用户属性,那些专用于这个类的属性 以下是男子级别: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类创建了一个控制器,即父类。我还在控制器中做了一些修改,以明确地指向用户
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));
}
}