asp.net-mvc – 如何在ASP.NET MVC 3中更新复杂模型
|
我试图在单个视图中更新复杂模型.
发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致. 这是我的简化视图模型: public class TransactionViewModel
{
public Transaction Transaction { get; set; }
public bool IsUserSubmitting { get; set; }
public IEnumerable<SelectListItem> ContractTypes { get; set; }
}
这是我的简化复杂模型,并作为其导航属性之一的示例. public class Transaction
{
[Key]
public int Id { get; set; }
public int CurrentStageId { get; set; }
public int? BidId { get; set; }
public int? EvaluationId { get; set; }
public virtual Stage CurrentStage { get; set; }
public virtual Bid Bid { get; set; }
public virtual Evaluation Evaluation { get; set; }
}
public class Bid
{
[Key]
public int Id { get; set; }
public string Type { get; set; }
public DateTime? PublicationDate { get; set; }
public DateTime? BidOpeningDate { get; set; }
public DateTime? ServiceDate { get; set; }
public string ContractBuyerComments { get; set; }
public string BidNumber { get; set; }
public DateTime? ReminderDate { get; set; }
public DateTime? SubmitDate { get; set; }
}
使用相同的视图模型,我能够创建一个事务对象,它将像这样填充数据库. Id:1,CurrentStageId:1,BidId:1,EvaluationId:1 但是,当我尝试更新这些导航属性中的属性时,此行会在控制器中导致错误: [HttpPost]
public ActionResult Edit(TransactionViewModel model)
{
if (ModelState.IsValid)
{
-> unitOfWork.TransactionRepository.Update(model.Transaction);
unitOfWork.Save();
return RedirectToAction("List");
}
}
在通用存储库中: public virtual void Update(TEntity entityToUpdate)
{
-> dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
问题更加复杂,因为我应该能够在单个视图中编辑Transaction对象中任何导航属性中的任何字段(属性). 解决方法我相信例外意味着以下内容:定义引用约束的属性值…(这些是Bid的主键属性(= Id)值和Transaction的外键属性(= BidId)值) ……不一致……(=有不同的值) ……校长之间…(=投标) ……和依赖…(=交易) ……关系中的对象. 因此,它看起来如下所示:当MVC模型绑定器创建TransactionViewModel作为Edit操作的参数时,model.Transaction.BidId和model.Transaction.Bid.Id是不同的,例如: > model.Transaction.BidId.HasValue为true但model.Transaction.Bid为null (第一点可能不是问题.我的猜测是你有情况2.) 这同样适用于CurrentStage和Evaluation. 可能的解决方案: >在调用存储库的Update方法之前,将这些属性设置为相同的值(= hack) 最后一点要提到的是这条线…… context.Entry(entityToUpdate).State = EntityState.Modified; …不会将相关对象(Transaction.Bid)标记为已修改,因此不会保存Transaction.Bid的任何更改.您还必须将相关对象的状态设置为“已修改”. 附注:如果您没有使用Fluent API for EF的任何其他映射,那么您的所有关系不是一对一的,而是一对多的,因为您有单独的FK属性.与EF的一对一关系需要共享主键. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 在网页上的ReportViewer控件中呈现时,Reporting
- asp.net-mvc-4 – Windows身份验证和Asp.Net Web API
- asp.net-mvc – Asp.net Web api异常仅在IIS部署之后:名为
- rest – asp.net Web Api – 默认错误消息
- asp.net-mvc-3 – 在ASP.NET MVC3中的自定义授权属性中使用
- asp.net-mvc – 可靠地处理ASP.NET MVC模型绑定错误
- asp.net – 在VS 2008嵌套母版页中包含对JavaScript的相对引
- asp.net – 在同一站点上使用基本身份验证和表单身份验证
- 在ASP.NET菜单控件中设置item.selected
- ASP.NET控件来渲染
- IIS 7.5中未显示任何ASP.NET功能
- asp.net-mvc – 在构建时尝试构建ASP MVC视图时出
- asp.net – 在调用“WebSecurity”类的任何其他方
- asp.net-mvc – 如何在共享托管环境中实现ASP.Ne
- ASP.Net Forms身份验证在10分钟后注销用户
- asp.net – 如何在Entity框架中添加表?
- ASP.Net – AJAX UpdatePanel中的Javascript
- asp.net – 如何在MVC4的部分视图中添加脚本?
- asp.net – MiniProfiler.Stop()上的MVC Mini Pr
- asp.net-mvc – 在ASP.NET MVC中的默认成员资格提
