Asp.net 关于在我的模型设计中使用“虚拟ICollection…”?
我在我的asp.net mvc HR web应用程序中,在我的实体数据模型中,在一个页面razor视图中,我加载并显示了多个数据模型,例如,在Employee razor视图中,我希望在顶部显示员工数据信息,但同样,我也希望显示与此员工相关的其他数据,如工资,性能和收益,所有这些相关数据都是单独的SQL表,这是不同的EF模型 所以为了简单起见,一个员工档案模型有其相关的工资、绩效和考核模型SQL表,所以我在员工档案模型中使用虚拟ICollectionAsp.net 关于在我的模型设计中使用“虚拟ICollection…”?,asp.net,asp.net-mvc,entity-framework-4,Asp.net,Asp.net Mvc,Entity Framework 4,我在我的asp.net mvc HR web应用程序中,在我的实体数据模型中,在一个页面razor视图中,我加载并显示了多个数据模型,例如,在Employee razor视图中,我希望在顶部显示员工数据信息,但同样,我也希望显示与此员工相关的其他数据,如工资,性能和收益,所有这些相关数据都是单独的SQL表,这是不同的EF模型 所以为了简单起见,一个员工档案模型有其相关的工资、绩效和考核模型SQL表,所以我在员工档案模型中使用虚拟ICollection In Employee Profile m
In Employee Profile model: I have these codes:
public class EmpProfile
{
public int ID { get; set; }
[Display(Name = "Employee Name")]
public string EmpName { get; set; }
[Display(Name = "Employee Number")]
public string EmpNum { get; set; }
[Display(Name = "Employee Title")]
public string EmpTitle { get; set; }
[Display(Name = "Department")]
public virtual ICollection<PerfPlan> PerfPlans { get; set; }
public virtual ICollection<ProgReview> ProgReviews { get; set; }
public virtual ICollection<ProgEvaluation> ProgEvaluations { get; set; }
public virtual ICollection<DevelopPlan> DevelopPlans { get; set; }
}
现在,在构建它们之后,在我的性能控制器中,我在Create方法中发现了以下代码行:
ViewBag.EmpProfileID=新建SelectListdb.EmpProfiles,ID,EmpName
在控制器生成的创建视图中,生成EmpProfileID dropdownlist字段
@Html.dropDownListMPProfileId,String.Empty
谁能告诉我为什么代码ViewBag.EmpProfileID=new SelectListdb.EmpProfiles,ID,EmpName;是在创建方法中生成的?因为生成器所知道或关心的是EmpProfileID是不可为空的int,所以它创建一个字段来编辑它。因为它是一个外键的id,所以它提供了一个EmpProfile id列表供您选择。如果不希望此字段直接可编辑,可以将其删除或更改为隐藏字段。您只需要记住,在您检查ModelState.IsValid之前,需要以某种方式对其进行设置,否则验证将失败。这会使您感到意外,如果我将公共类emprofile{public int ID{get;set;}更改为公共类emprofile{public int emprofileid{get;set;}我是否仍然在绩效中获得该downlist字段?我真正想做的是在EmployeeProfile和绩效之间建立关系,我不希望生成该dropdownlist。我只是像上面提到的那样进行了尝试-我在Employee Profile模型中将主ID更改为EmpProfileID,但我仍然获得ViewBag.EmpProfileID=new SelectListdb.EmpProfiles,ID,EmpName;在我的性能控制器中生成,似乎我无法避免生成它,我不希望用户编辑此下拉列表,我希望自动设置该数据字段,而无需用户编辑和隐藏。有什么想法吗?似乎我无法删除它。没有。生成器将包含所有必需的字段d、 显式或不显式。但是,仅仅因为它是生成的并不意味着您必须使用它:如果您不希望它出现,只需从生成的HTML中删除该字段。如果修改生成的HTML确实让您感到非常困扰,那么只需使用视图模型而不是实际的实体。只想澄清一下:MVC scalfol生成的代码ding在控制器中的代码为:ViewBag.EmpProfileID=new SelectListdb.EmpProfiles,EmpProfileID,EmpName;,在razor视图中的代码为:@Html.dropdownStempProfileId,String.Empty@Html.ValidationMessageFormodel=>model.EmpProfileID,如果我只在控制器中保留代码并删除关联的代码s在razor视图中,然后当我单击“创建”保存记录时,数据将不会保存,因为提供了dropdownlist字段。正如我在回答中所说,如果您没有在表单中提供字段,那么您只需确保以某种方式设置了值。
public class Performance
{
public int ID { get; set; }
public int EmpProfileID { get; set; }
[Required(ErrorMessage = "{0} is required.")]
[Display(Name = "Name*:")]
public string EmpName { get; set; }
[Required(ErrorMessage = "Please enter your Employee Number.")]
[Display(Name = "Employee No.*:")]
public string EmpNum { get; set; }
......
public virtual EmpProfile EmpProfile { get; set; }
}