gpt4 book ai didi

asp.net-mvc - 如何在 ASP.NET MVC 3 中更新复杂模型

转载 作者:行者123 更新时间:2023-12-04 13:42:59 26 4
gpt4 key购买 nike

我正在尝试在单个 View 中更新复杂模型。
我正在使用 ASP.NET MVC3、带有代码优先的 Entity Framework 、工作单元、通用存储库模式..
但是当我尝试更新模型时,我想出了这个错误:

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

这是我的简化 View 模型:

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

}

使用相同的 View 模型,我能够创建一个事务对象,它将像这样填充数据库。

ID:1,CurrentStageId:1,BidId:1,EvaluationId:1

但是,当我尝试更新这些导航属性中的属性时,此行会在 Controller 中导致错误:
[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;
}

问题更加复杂,因为我应该能够在单个 View 中编辑 Transaction 对象内任何导航属性中的任何字段(属性)。

最佳答案

我认为异常意味着以下内容:

定义引用约束的属性值... (这些是 Id 的主键属性 (= Bid ) 值和 BidId 的外键属性 (= Transaction ) 值)

... 不一致... (= 有不同的值)

... 校长之间 ... (= Bid)

...和依赖... (= Transaction)

...关系中的对象。

因此,它如下所示: 当 MVC 模型绑定(bind)器创建 TransactionViewModel作为 Edit 的参数行动,model.Transaction.BidIdmodel.Transaction.Bid.Id是不同的,例如:

  • model.Transaction.BidId.HasValuetrue但是 model.Transaction.Bidnull
  • model.Transaction.BidId.HasValuefalse但是 model.Transaction.Bid不是 null
  • model.Transaction.BidId.Value != model.Transaction.Bid.Id

  • (第一点可能不是问题。我猜你有情况2。)

    这同样适用于 CurrentStageEvaluation .

    可能的解决方案:
  • 在调用 Update 之前将这些属性设置为相同的值存储库的方法 (=hack)
  • 绑定(bind)TransactionViewModel.Transaction.BidIdTransactionViewModel.Transaction.Bid.Id到两个具有相同值的隐藏表单字段,以便模型绑定(bind)器填充两个属性。
  • 也为您的内部 Transaction 使用 ViewModel属性(以及 Transaction 内部的导航属性),它是为您的 View 量身定制的,您可以将其适本地映射到 Controller 操作中的实体。

  • 最后一点要提到的是,这条线......
    context.Entry(entityToUpdate).State = EntityState.Modified;

    ... 不会将相关对象 ( Transaction.Bid ) 标记为已修改,因此它不会保存 Transaction.Bid 的任何更改.您必须将相关对象的状态设置为 Modified也是。

    旁注:如果您没有使用 Fluent API for EF 的任何其他映射,那么您的所有关系都不是一对一而是一对多,因为您有单独的 FK 属性。与 EF 的一对一关系需要共享主键。

    关于asp.net-mvc - 如何在 ASP.NET MVC 3 中更新复杂模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8856588/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com