如何在 ASP.NET MVC 3 中更新复杂模型

2023-11-24

我正在尝试在单个视图中更新复杂模型。 我正在使用 ASP.NET MVC3、代码优先的实体框架、工作单元、通用存储库模式。 但是当我尝试更新模型时,出现以下错误:

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

这是我的简化视图模型:

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 对象内任何导航属性内的任何字段(属性)。


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

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

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

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

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

...关系中的对象。

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

  • model.Transaction.BidId.HasValue is true but model.Transaction.Bid is null
  • model.Transaction.BidId.HasValue is false but model.Transaction.Bid is not null
  • model.Transaction.BidId.Value != model.Transaction.Bid.Id

(第一点可能是not一个问题。我的猜测是你遇到的是情况2。)

这同样适用于CurrentStage and Evaluation.

可能的解决方案:

  • 在调用之前将这些属性设置为相同的值Update你的存储库的方法(=hack)
  • Bind TransactionViewModel.Transaction.BidId and TransactionViewModel.Transaction.Bid.Id到两个具有相同值的隐藏表单字段,以便模型绑定器填充这两个属性。
  • 还可以使用 ViewModel 来表达你的内心Transaction属性(以及内部的导航属性Transaction以及)它是根据您的视图定制的,您可以将其适当地映射到控制器操作中的实体。

最后要提到的一点是,这条线......

context.Entry(entityToUpdate).State = EntityState.Modified;

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ASP.NET MVC 3 中更新复杂模型 的相关文章

  • 身份服务器刷新令牌资源所有者密码凭证流程

    我正在使用 IdentityServer 来控制对 API 的访问 我有一个单独的身份验证 API 它发出令牌并验证访问请求以确保 API 的安全 我让用户能够通过安全的 Web 应用程序生成访问令牌 我正在使用资源所有者密码凭证流程 有没
  • .net 4.7 中的依赖注入?

    我对 DI 有哪些集成选项有点困惑 我发现它对于 net core 对于我的特定项目 来说非常简单 但我不需要构建跨平台应用程序 也看不到使用 core 的优势 但是 net 框架应用程序似乎仍然使用 Global asax 设置且没有 S
  • 如何在 Entity Framework 4.4 中实现 DBSet.AddOrUpdate?

    回应 Slauma 对我的问题的回答关于在 Windows XP 上运行使用 EF 的应用程序 https stackoverflow com questions 17963417 can i implement entity framew
  • 具有实体框架的 MVC 控制器的 T4 模板 - 主机的成员属性 (MvcTextTemplateHost)?

    有谁有我可以在 MVC 3 附带的 T4 模板 ControllerWithContext tt 中使用的 Host 对象成员的完整引用吗 我已经尝试了我能想到的所有谷歌搜索 但唯一相关的结果是这个页面 http blogs msdn co
  • 从 .Net MVC 视图获取 HTML,而不在浏览器中实际渲染视图?

    我的控制器中有一个 ActionResult 我想从中发送 HTML 电子邮件 该电子邮件的正文是由视图生成的 我可以在传递模型时获取视图的结果并避免将其发送到浏览器 而不是在控制器中使用 2 个 actionresults 方法吗 Mvc
  • AutoMapper.Mapper 不包含 CreateMap 的定义

    这可能是一个基本问题 但想知道我没有得到 AutoMapper Mapper CreateMap 方法 我使用了错误的 AutoMapper 参考 包吗 谢谢 静态版本CreateMap方法在 4 2 中已弃用 然后在版本 5 0 中从 A
  • 包括过滤器子集合[重复]

    这个问题在这里已经有答案了 我在为 LINQ 查询中包含的项目添加一些过滤条件时遇到一些困难 我的查询就像 var item Context Order Include Inner Include Inner first Include I
  • PostAsync 方法的 HttpClient 错误

    使用 HttpClient 对第 3 方 API 进行 PostAsync 调用时 当我执行 client PostAsync 时 我正好看到此错误 知道是什么原因造成的吗 Code public class JobController A
  • ASP.NET MVC 应用程序中的工作单元模式

    我一直在看这个优秀的blog http www nhforge org wikis patternsandpractices nhibernate and the unit of work pattern aspx标题为 NHibernat
  • 构建 ViewModel 的合适粒度是多少?

    我正在开发一个新项目 在看到以前项目的一些困难后 这些项目没有提供足够的视图与模型的分离 特别是使用 MVC 模型和视图开始有点相互渗透 我想使用 MVVM 我了解基本概念 并且很高兴开始使用它 然而 有一件事我有点忽略 ViewModel
  • 如何使用 Entity Framework Code First 在两个实体之间建立多个一对多关系

    下面是保存关系数据库记录的简单方法 该方法运行得很好 我对一种情况有疑问 在此之前 我需要知道如果数据库复杂性增加 我所采用的方法会遇到什么困难 还有更好 高效但简单的方法吗 一对一 tb student store student det
  • IsReusable 属性中的上下文切换

    是否可重用属性 下面是我的理解IsReusable财产 如果处理程序返回静态内容 将值设置为 true 是安全的 但如果线程返回动态内容 为了使其线程安全 IsReusable应设置为 false 在这种情况下 可能会发生上下文切换 这可能
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 实体框架 - SQL Server 2005 - IIS 服务器日期时间问题

    我正在使用 MVC3 和实体框架 在我的应用程序中 我需要通过 EF 调用 SQL Server 2005 中的存储过程来根据以下内容搜索一些数据datetime传递的参数 在当地环境中一切似乎都运行良好 但是将其托管到 IIS 后 我在尝
  • EF 4.1 加载过滤的子集合不适用于多对多

    我一直在看显式加载相关实体时应用过滤器 http blogs msdn com b adonet archive 2011 01 31 using dbcontext in ef feature ctp5 part 6 loading re
  • EF4如何在多对多关系中公开联接表

    假设我有以下表格 Essence EssenceSet 和 Essence2EssenceSet 其中 Essence2EssenceSet 仅保存前 2 个表的 ID 以形成 M M 关系 在 EF 中 由于 Essence2Essenc
  • 无法将 MVC 4 部署到服务器

    我的 Web 应用程序只是一个用 VS 2010 MVC 4 制作的简单 Web 应用程序 没有任何外部代码 它只是 VS 2010 的默认应用程序 我有 Plesk 的豪华 Windows 托管 我从未更改过帐户中的任何功能 我将所有文件
  • 从数据库和文件系统中删除文件

    我有一个表引用我们网络上共享位置中的文件 将文件路径存储在数据库中 我有一个按钮需要从数据库中删除记录并从文件系统中删除文件 foreach var report in reports string filePath report Repo
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 良好的 WiX 编辑器 [重复]

    这个问题在这里已经有答案了 我目前正在开发一个使用 WiX 创建 MSI 的项目 我过去在 Sourceforge 上使用 WiXEdit 来管理包含在 WiX 项目中的文件 因为它比直接操作 XML 稍微容易一些 但它仍然有点笨重 有谁知

随机推荐

  • 通过自动解锁从类返回锁定的资源

    我想要一个返回指向资源的指针的类成员函数 资源应自动锁定和解锁 我考虑创建一个不可复制的对象来处理锁定 您认为以下是一个好的解决方案吗 它是线程安全的吗 STL 中是否已有适用于此用例的工具 template
  • Scala String* 类型(在函数 args 中)

    我有以下方法 def m a String 我想知道此语法中星号 符号的用途是什么 我显然是 Scala 的新手 我用谷歌搜索 但可能搜索错误的东西 任何帮助表示赞赏 Cheers 它被称为 var args 变量参数 def concat
  • 我可以在批处理脚本中的一个“查找”命令中搜索多个字符串吗?

    我有一个 Windows 批处理脚本 它将在文件中查找字符串 find i WD6 Inputpath file txt if errorlevel 0 GOTO somestuff 目前 这就是我的代码的样子 我遇到了一个新字符串 我想在
  • 如何使用 C#6“使用静态”功能?

    我正在看其中的几个新功能在C 6 具体来说 使用静态 using static is a new kind of using clause that lets you import static members of types direc
  • 关于 NaN 运算的问题

    我的 SSE FPU 生成以下 NaN 当我执行任何基本的对偶运算 如 ADDSD SUBSD MULSD 或 DIVSD 并且两个操作数之一为 NaN 时 结果具有 NaN 操作数的符号 并且结果尾数的低 51 位将加载NaN 操作数尾数
  • Rails:金钱宝石将所有金额转换为零

    我正在尝试使用金钱宝石在我的应用程序中处理货币 但我遇到了一个奇怪的错误 这就是我的 记录 模型中的内容 composed of amount class name gt Money mapping gt w cents cents w c
  • AddWithValue 参数为 NULL 时出现异常

    我有以下代码用于指定 SQL 查询的参数 我使用时遇到以下异常Code 1 但当我使用时效果很好Code 2 In Code 2我们检查是否为空 因此if else block 例外 参数化查询 application ex id nvar
  • 检查字符串是否不为 Null 且不为 Empty

    如何检查字符串是否不是null并且不为空 public void doStuff String str if str null str here I want to check the str is empty or not handle
  • Eclipse“服务器位置”部分已禁用,需要更改为使用 Tomcat 安装

    我已经在 Eclipse 中设置了一个动态 Web 项目 并安装了 Tomcat 5 5 我想将服务器设置为 Tomcat 安装而不是工作区元数据位置 但是当 Eclipse 显示服务器的 概述 屏幕时 服务器位置 部分被禁用 因此我无法更
  • 如何动态地将 swt 小部件添加到组合中?

    我正在尝试通过单击按钮将文本框 按钮等小部件添加到组合中 我已经尝试过 但我只能动态添加这些小部件 最多可达复合材料的大小 我的 jface 对话框是这样的 它有一个滚动的组合 其中包含一个组合 在主要复合材料中 我还有 3 个其他复合材料
  • Android glSurfaceView 使用 XML/Java 进行覆盖

    我启动了一个 Android OpenGL 应用程序 并且有以下类 class A extends Activity class B extends GlSurfaceView implements Renderer 当调用A类的onCre
  • log4j2 JDBC Appender 问题:插入记录失败

    我创建了一个 JDBC 附加程序并绑定 ColumnConfig 和 DataSourceConnectionSource 在尝试在数据库中插入记录时 Logger debug Test 我遇到以下异常 Thanks 6 16 14 18
  • ipython 控制台中的语法高亮显示

    我在用ipython同时在qtconsole并在终端中 In ipython qtconsole 当我输入时import pandas as pd这些单词有语法突出显示 但是 当我在控制台中输入时 所有文本都是白色的 Python 控制台也
  • 如何将模式作为参数传递给sql server中的存储过程?

    我有一个存储过程来根据两个表选择数据列表 第一个表是固定的 CO Country 但第二个表可以是多个表之一 表本身的名称是相同的 Location 但是 表的架构不同 ABD Location CGA Location GBN Locat
  • include() 不适用于所有浏览器

    这是我的代码块 它在 fireFox 和 Chrome 中完美运行 但在 IE 中不行 我收到错误 Object doesn t support property or method includes function rightTreeS
  • 生产代码+测试模块信息=不可能?

    我有一个模拟类 其中包含我从模块提供的服务的简单实现 我正在使用 OpenJDK 11 03 gradle 5 2 1 和 IntelliJ 2019 2 In main code myPackage myService java I ha
  • SQL 2005 Reporting Services 如果检查 null

    在 SSRS 2005 中 我有一个表 其中链接了一个数据集 我想检查字段的值是否为空 如果不为空 则格式化数据以确保它有一位小数并添加 符号等 这是我在现场 专栏上的表达 iif IsNothing Fields COL01 Value
  • 无参数可变参数模板上的不明确重载

    有关的 使用可变参数访问无参数模板函数的不明确重载 简单的可变参数模板函数无法实例化 为什么这个可变参数函数不明确 考虑这对可变参数模板 template
  • Autofac:如何加载被引用但不直接使用的程序集

    我们使用 Autofac for DI 创建了一个 WebApi 解决方案 我们将 autofac 的引导分解为一个单独的项目 这样 我们的 WebApi 项目仅引用我们的 Bootstrap 和 Contracts 项目 然后 我们的引导
  • 如何在 ASP.NET MVC 3 中更新复杂模型

    我正在尝试在单个视图中更新复杂模型 我正在使用 ASP NET MVC3 代码优先的实体框架 工作单元 通用存储库模式 但是当我尝试更新模型时 出现以下错误 发生参照完整性约束违规 定义参照约束的属性值在关系中的主体对象和从属对象之间不一致