Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 关于在我的模型设计中使用“虚拟ICollection…”?_Asp.net_Asp.net Mvc_Entity Framework 4 - Fatal编程技术网

Asp.net 关于在我的模型设计中使用“虚拟ICollection…”?

Asp.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

我在我的asp.net mvc HR web应用程序中,在我的实体数据模型中,在一个页面razor视图中,我加载并显示了多个数据模型,例如,在Employee razor视图中,我希望在顶部显示员工数据信息,但同样,我也希望显示与此员工相关的其他数据,如工资,性能和收益,所有这些相关数据都是单独的SQL表,这是不同的EF模型

所以为了简单起见,一个员工档案模型有其相关的工资、绩效和考核模型SQL表,所以我在员工档案模型中使用虚拟ICollection

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