无法在数据库更新时保存更改。奇怪的延迟加载行为可能吗?

2024-04-04

现在,我的代码看起来就像这样简单:

public class FooController : Controller
{
    private readonly ApplicationDbContext db;

    public FooController()
    {
        db = new ApplicationDbContext();
    }

    public ActionResult Update(int id) 
    {
        Foo foo = db.Foos.Find(id);
        foo.X = "new string";
        db.SaveChanges();
        return Redirect("Index", "Home");
    }
}

假设 Foo 有一个属性 X、一个字符串和一个属性 Bars(Bar 实体的集合)。该属性有一个限制,即集合中的柱数必须在 1 到 100 之间。

我目前遇到以下异常:

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

我调试并打印出了实际的错误:

Property: "Bars", Error: "Must have between 1 and 100 bars"

这让我很困惑,因为我知道那个特定的例子foo其收藏中有 5 个酒吧。所以我在上面打了一个断点db.SaveChanges()行并使用 VS 工具将鼠标悬停在 foo 实例上,发现集合中确实有 5 个 Bars。当我继续运行该程序时,更新成功完成。起初我觉得这很奇怪。也许存在低级别竞争条件(我说低级别是因为我没有在应用程序级别执行任何异步/线程)并且断点允许其他线程赶上。也就是说,直到我再次使用断点运行更新without将鼠标悬停在 foo 实例上,等待几秒钟,然后继续程序的运行。错误返回。

所以我认为当我将鼠标悬停在foo并且该负载对于保存更改是必需的。这是一个已知的问题?我是否应该发布代码的其他部分来弄清楚发生了什么?

编辑:作为临时解决方法,以防万一这会增加更多证据。以下添加允许该方法按预期工作:

public ActionResult Update(int id) 
{
    Foo foo = db.Foos.Find(id);
    foo.X = "new string";
    Debug.WriteLine(foo.Bars);
    db.SaveChanges();
}

显然这是一个创可贴,我想知道这里到底发生了什么。

另一个编辑:添加如何在 Foo.Bars 上实现验证

public class Foo 
{
    public string X {get;set;}

    [MinMaxLength]
    public virtual ICollection<Bar> Bars {get; set;}
}

MinMaxLength 如下所示:

public class MinMaxLength : ValidationAttribute
{
    public int Min { get; set; } = 1;
    public int Max { get; set; } = 100;

    public MinMaxLength()
        : base("Must have between 1 and 100")
    {

    }

    public MinMaxLength(string errorMessage)
        : base(errorMessage)
    {

    }

    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return true;
        }
        var coll = value as ICollection;
        if (coll == null)
        {
            return false;
        }

        var count = coll.Count;
        return count >= Min && count <= Max;
    }
}

Foo foo = db.Foos.Find(id);
if (foo != null)
{
    foo.X = "new string";
    db.Foos.Attach(foo);
    var entry = db.Entry(foo);
    entry.Property(x => x.X).IsModified = true;
    db.SaveChanges();
}

这应该生成以下 SQL:

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

无法在数据库更新时保存更改。奇怪的延迟加载行为可能吗? 的相关文章

  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • Verilog 中的 If 语句和分配连线

    我试图弄清楚基于组合逻辑分配电线的基础知识 I have wire val wire x wire a wire b always begin if val 00 I want to assign x a if val 01 I want
  • Webservice方法返回XmlDocument,Reference看到一个XmlNode

    我遇到了一个无法解决的问题 所以我请求你帮助我 我正在使用 WebService 并尝试从名为 GetSystemDocument 的 WebService 方法返回 XmlDocument 该方法如下所示 WebMethod Descri
  • 当overflow-x:hidden时禁用鼠标滚动[CSS,HTML]

    问题 我的 div 的内容定位为 绝对 并且内容的宽度大于 div 根据需要 使用 overflow x hidden 剪辑 额外 内容 不过 如果我尝试使用鼠标滚动进行水平滚动 内容就会变得可见 我怎样才能不让这种事发生呢 我可以使用 J
  • While 循环不运行indexOf 搜索

    我试图找出一个字符串在另一个字符串中出现了多少次 在我的测试中 我对第一个单词使用 ea 对第二个单词使用 Ilikedthebestontheeastbeachleast 我的输出为 appearance 变量返回 0 该变量应该存储 e
  • 如何在 SwiftUI 中删除 List 和 ScrollView 的底部填充

    我想删除底部填充 即红色空间之间的空白 有什么办法可以实现吗 测试代码 struct ContentView View var body some View return NavigationView VStack the same res
  • Fabric.js 鼠标右键单击

    有没有办法在 Fabric js 画布上接收右键单击鼠标事件 以下代码仅适用于左键单击 canvas observe mouse down function console log mouse down NOTE 上面的大多数答案都已经过时
  • Rails 项目中的 rake 范围?

    我在我正在从事的项目中使用了许多解析器 当使用另一个 rake 中已经存在的方法名称时 并且因为它们都使用相同的环境 所以我会遇到冲突 有没有办法限制 rake 文件在其命名空间内的范围 我认为这就是命名空间的全部意义 Example na
  • 如何在WebLogic上查找JNDI资源?

    我在 WebLogic 11g 上部署了一个遗留应用程序 该应用程序具有以下代码 Context context new InitialContext dataSource javax sql DataSource context look
  • vaadin gwt 编译器错误未知参数:-war

    我的 vaadin 项目有问题 由于我对 vaadin 相当陌生 所以我不确定如何解决它 我想重新编译我的小部件集 但即使在自定义 Eclipse 之后 我也会收到相同的错误消息 首先它通过命令行执行编译器 接下来它告诉我小部件集是从某个类
  • Azure API 无法识别来自 Terraform 的服务主体

    为了使 Terraform azurerm 提供程序能够对将使用以下代码创建的服务主体进行身份验证 需要对下面的语法进行哪些具体更改 问题 A secondTerraform 模块需要通过 azurerm 提供程序向 Azure 进行身份验
  • 蓝牙连接无需配对

    连接蓝牙设备的正常方式是通过配对 我们需要以非正常方式连接到设备 仅使用蓝牙 MAC 地址 我们不希望系统提示输入 PIN 我们知道该设备支持此技术 但我们找不到在 Android 上执行此操作的方法 缩写代码如下所示 String mac
  • 如何使用 Storyboards 引用 UISearchController

    我添加了一个搜索栏和搜索显示控制器 假设这是我在情节提要中添加的内容 因为它们没有可拖出的 SearchController 对象 我的问题是现在如何设置 SearchController 的属性 self searchController
  • groupby 对象 pandas 的绝对值平均值

    我想计算分组对象的绝对值的平均值 I e grouped df groupby pd TimeGrouper 3MS dct x grouped profit agg mean grouped cost abs agg mean 但是 上面
  • 在 Raphael js 中使路径和图像可拖动

    是否可以使用 Raphael js 在页面周围拖放除圆形和矩形之外的对象 我想添加路径和图像 然后您可以移动它们 但事实证明这很棘手 我想与 Raphael 一起解决这个问题 因为它支持触摸界面 这是代码
  • 如何在标签下方水平对齐单选按钮

    因此 我使用以下 HTML 在 jsp 中的各自标签下方水平居中显示 4 个单选按钮
  • 在 onPostExecute 中调用另一个类的方法导致 nullPointerException

    这也可能对某人有帮助 由于 AsyncTask 是一个单独的类 如何将 OnPostExecute 的结果获取到主活动 https stackoverflow com questions 12575068 how to get the re
  • 无法在Windows上启用rabbitmq管理插件

    所以 这就是我所做的 在我的 Windows x64 位机器上安装了 Erlang 安装 RabbitMQ 启动 RabbitMQ 服务 这一步我没有任何错误 但是 当我尝试启用rabbitmq management时 我在控制台中收到一些
  • 使用 Prototype 迭代 javascript 中对象的每个属性?

    有没有办法使用 Prototype JavaScript 框架迭代对象的每个属性 情况如下 我收到 JSON 格式的 AJAX 响应 如下所示 foo 1 bar 2 barobj 75 true 76 false 85 true 如果我评
  • MySQL 如何在使用 Group By 时为不匹配的列分配空值

    我有以下 MovieTheaterTbl 表 Name Location Date TicketRevenue SnackRevenue BeverageRevenue AMC Alpine St 8 14 100 80 60 Atlas
  • 无法在数据库更新时保存更改。奇怪的延迟加载行为可能吗?

    现在 我的代码看起来就像这样简单 public class FooController Controller private readonly ApplicationDbContext db public FooController db