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