Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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 mvc 3 EF4引用完整性异常是否先使用代码?_Asp.net Mvc 3_Entity Framework 4.1 - Fatal编程技术网

Asp.net mvc 3 EF4引用完整性异常是否先使用代码?

Asp.net mvc 3 EF4引用完整性异常是否先使用代码?,asp.net-mvc-3,entity-framework-4.1,Asp.net Mvc 3,Entity Framework 4.1,我有一个非常简单的模型,如下所示: public class Cases { //case data model for call center //implement lists for all related child tables too [Key] public int CasesID { get; set; } public string CaseNumber { get; set; } [Required(ErrorMe

我有一个非常简单的模型,如下所示:

public class Cases
    {
    //case data model for call center
    //implement lists for all related child tables too

    [Key]
    public int CasesID { get; set; }

    public string CaseNumber { get; set; }

    [Required(ErrorMessage = "Customer is Required")]
    public int CustomerID { get; set; }
    public Customer Customer { get; set; }

    [MaxLength(50)]
    public string UserName { get; set; }  //get user name from the aspnet membership

    [Required(ErrorMessage = "Case Category is Required")]
    public int CaseCategoryID { get; set; }

    [Required(ErrorMessage = "Technician is Required")]
    public int TechnicianID { get; set; }
    public Technician Technicians { get; set; }

    [Required(ErrorMessage = "Engine Model is Required")]
    public int EngineModelID { get; set; }
    public EngineModel EngineModel { get; set; }

    [MaxLength(50)]
    public string BMSWorkorder { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Status is Required")]
    public string CaseStatus { get; set; }

    [MaxLength(50)]
    public string OpenedBy { get; set; }

    [Required(ErrorMessage = "Opened Date is Required")]
    [DataType(DataType.DateTime)]
    public DateTime? OpenedDate { get; set; }

    [MaxLength(50)]
    public string ClosedBy { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? ClosedDate { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage="Caller First Name is Required")]
    public string CallerFirstName { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Caller Last Name is Required")]
    public string CallerLastName { get; set; }

    [MaxLength(10)]
    [Required(ErrorMessage = "Qualified is Required")]
    public string Qualified { get; set; }

    public string Description { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "ESN is Required")]
    public string ESN { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Mileage is Required")]
    public string Mileage { get; set; }

    [DataType(DataType.Date)]
    public DateTime? DateInService { get; set; }

    [MaxLength(50)]
    public string ESTR { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "EDS is Required")]
    public string EDS { get; set; }

    [MaxLength(50)]
    public string GensetSerialNumber { get; set; }

    [MaxLength(50)]
    public string GensetModelNumber { get; set; }

    //child Case Notes records
    public virtual ICollection<CaseNotes> CaseNotes { get; set; }

    //child case attachment records
    public virtual ICollection<Attachment> Attachments { get; set; }

    //child case complaint records
    public virtual ICollection<CaseComplaint> CaseComplaint { get; set; }

    //tracking fields
    public DateTime? CreatedOn { get; set; }
    [MaxLength(50)]
    public string CreatedBy { get; set; }
    public DateTime? ModifiedOn { get; set; }
    [MaxLength(50)]
    public string ModifiedBy { get; set; }
    }

仅解释例外情况的含义:

发生引用完整性约束冲突:属性 定义引用约束的值不一致 在关系中的主体对象和从属对象之间

控制器post操作中的主要对象是
案例。技师
,从属对象是
案例
。“定义引用约束的属性值”是从属对象中的外键,即
cases.TechnicianID
,另一方面是主体的主键,即
cases.technologies.TechnicianID

例外情况是这两个值不同:
cases.TechnicianID!=cases.technologies.technologinianID
,但在更新实体时必须相同

我不知道你的观点到底应该做什么。您只能编辑
案例
实体或
案例.技术人员
属性吗?或者,您只能将新的现有技术人员分配给
案例
?如果是后者,我正在解释为什么模型绑定器会创建一个
cases.technologies
实例,因为不应该有任何表单字段保存
cases.technologies
的属性。要指派其他现有技术人员,外键
cases.TechnicianID
绑定到表单字段就足够了


在任何情况下,您都需要确保
cases.TechnicianID
cases.technologies.technologies
具有相同的值,或者
cases.technologies
null
。这取决于视图应该做什么以及需要更新哪些数据-仅
案例
属性或
案例。技术人员
属性。

“但是导航属性中的数据似乎认为我试图在这些类中插入新记录”:因此,那么这是一个视图和模型绑定的问题,或者导航属性值从何而来?我是一个noob,所以你必须忍受我。上述技术人员和客户的财产,和EngineModel应该只允许我显示子数据,但它们似乎与cases类一起被标记为“已修改”。我认为如果您可以显示post操作以及如何处理数据直到保存更改,这将非常有用。导航属性将在保存时创建子记录,因为存在FK约束。如果没有FK值,则会出现RI错误。例如:TechnicianID必须与现有技术人员对应,如果不对应,EF将尝试为您创建一个。@Maess,就是这样。在我的案例创建视图中,我确实选择了一个有效的技师,并且在编辑记录时可以看到正确的技师id。因此,技师id对应于有效的技师。感谢您抽出时间。该视图主要用于添加和编辑案例。可以通过下拉菜单选择现有技术人员(technicianid),并将其与案例关联。我之所以使用cases.technologies属性是为了显示有关该案例的技师信息。因此,作为EF的新手,我对必须确保Technician ID和cases.Technician.Technician ID相同感到有点困惑。我不想从案例视图中更新到案例。技师。@Ryan:您可能可以通过在post操作开始时将
cases.technologies
设置为
null
来解决问题。但这是一种黑客行为,奇怪的是,
cases.technologies
不是
null
,而
cases.technologies.technologyinaid
是错误的。顺便说一句:在大多数情况下,更好的方法是将ViewModels用于MVC视图,而不是直接用于实体。您的ViewModel包含应该编辑的属性,并且在post操作中,您将ViewModel映射回实体,以使属性得到所需的更新。我认为与其进行黑客攻击,我更希望以正确的方式进行操作,不是吗?在我学习如何使用视图模型时,您是否会监视此线程?很奇怪,一个简单的操作,比如将父记录与子记录关联,会出现如此大的问题。
public ActionResult Edit(int id)
    {
        Cases cases = db.Cases.Find(id);
        db.Entry(cases).Reference(x => x.Customer).Load();
        db.Entry(cases).Collection(x => x.CaseComplaint).Load();
        db.Entry(cases).Collection(x => x.CaseNotes).Load();
        db.Entry(cases).Reference(x => x.Technicians).Load();

        GetCaseCategoryLookup(cases.CaseCategoryID);
        GetEngineModelLookup(cases.EngineModelID);
        GetTechnicianLookup(cases.TechnicianID);
        GetQualifiedList(cases.Qualified);
        GetCaseStatusList(cases.CaseStatus);

        return View(cases);
    }

    //
    // POST: /Cases/Edit/5

    [HttpPost]
    public ActionResult Edit(Cases cases)
    {
        if (ModelState.IsValid)
        {
        AppHelpers help = new AppHelpers();

            if (cases.CaseStatus == "CLOSED")
                {
                cases.ClosedBy = "USER";
                cases.ClosedDate = help.GetEasternTime();
                }
            cases.ModifiedBy = "USER";
            cases.ModifiedOn = help.GetEasternTime();

            db.Entry(cases).State = EntityState.Modified;
            db.SaveChanges();

        }

        return RedirectToAction("Index");
    }