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

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(使用前将#替换为@)

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

  • 更改实体的可访问性

    我想建立一个内部实体 我已将实体 其标量属性和导航属性更改为内部 当我尝试构建它时出现此错误 错误 6036 EntityType 文件 具有 内部 可访问性 EntitySet 文件 具有具有 公共 可访问性的 get 属性 Entity
  • MVC4 - ContextDependentView - 是什么意思?

    我刚刚开始使用 MVC4 我看到的第一个操作方法有一些新内容 我查了一下互联网 找不到任何关于此的信息 public ActionResult LogOn return ContextDependentView 有谁知道 ContextDe
  • Web浏览器控件:如何捕获文档事件?

    我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页 在这个页面上我有一个锚点或一个按钮 我想在我的应用程序后面的代码中 即在 C 中 捕获该按钮的单击事件 WebBrowser 控件是否有办法捕获加载页面元素上的单击事件
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • 使用左连接获得不适当的输出

    我正在尝试获取变体列表 并且对于每个变体都获取所有subvariants list无论子变体属于何处 特别的Test say 100 这是示例数据 Id TestId SourceSubVariantId TargetSubVariantI
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • “DeploymentItem”属性是什么意思?

    假设我们有一个简短的程序 namespace ConsoleTryIt static class Program static void Main string args var sum Add 1 2 private static int
  • 我的代码哪里有泄漏?

    下面是我的代码 它打开一个 XML 文件 old xml 过滤无效字符并写入另一个 XML 文件 abc xml 最后 我将再次加载 XML abc xml 当执行以下行时 出现异常 表示 xml 文件被另一个进程使用 xDoc Load
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 如何解决 boost::multi precision::cpp_dec_float 除法错误

    除以boost multiprecision cpp dec float有某种舍入误差 如下 include
  • 在链表程序中使用模板时重载 C++ 中的 << 运算符

    我正在尝试实现一个链接列表 但是当我尝试重载 include
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • 使用 DataGridViewCheckboxCell 真正禁用 DataGridView 中的复选框

    有谁知道如何使用 DataGridViewCheckboxCell 禁用 DataGridView 中的复选框 我可以将其设置为只读 并设置背景颜色 但我无法让复选框本身显示为禁用状态 有什么想法吗 Guess 你必须自己画 http so
  • C++ 在预处理器 #if 中对 sizeof() 比较抛出编译错误

    我有这个 它不会从 Visual Studio 编译错误 致命错误 C1017 无效的整数常量表达式 我该怎么做 template
  • 如何使用 .NET 捕获我的桌面视频?

    我想知道是否有任何方法可以使用 NET 捕获我的桌面的视频 截屏视频 我并不是在寻找截屏软件 而只是在寻找一种可以让我自己生成桌面视频的技术 我想过拍摄多个屏幕截图 但我不确定如何以编程方式生成带有图像序列的视频 有人有主意吗 Thanks
  • 从数据库配置中的连接字符串中删除 SSIS 密码

    我有一个 SSIS 包 它使用 SQL 服务器中的 SSIS 配置表来检索 OLE DB 连接管理器的连接字符串属性 问题是我还需要相同的连接字符串来调用使用实体框架的程序集 我尝试访问连接管理器连接字符串属性 但 SSIS 总是删除密码
  • SMTP 客户端在 C# 应用程序中显示错误“未采取请求的操作”

    我正在尝试使用 hotmail 帐户设置电子邮件发送应用程序 代码如下所示 MailMessage mail new MailMessage from to mail Subject Proba email mail Attachments
  • 推断“x => { throw .. }”的 Lambda 与重载方法中的 Func 匹配吗?

    我不明白为什么 C 最终在以下 LINQPad 代码中执行不正确的扩展方法 void Main Actual Sync Action Expected Sync Action Run x gt x Dump Actual Async Tas

随机推荐

  • 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