gpt4 book ai didi

entity-framework - 如何在 Entity Framework 数据库第一种方法中用具有相同键的另一个实体替换实体?

转载 作者:行者123 更新时间:2023-12-04 07:23:33 26 4
gpt4 key购买 nike

我首先使用 EF 5 数据库编写 MVC 4 web 应用程序。我有一些明显微不足道的问题,我找不到合适的解决方案。这些问题与对象状态管理器有关。

在最简单的场景中,一切正常:我使用 Find 从数据库中读取实体,将它们放入 View 中,等待响应,重新构建实体,然后使用 Attach、EntityState.Modified 和 SaveChanges 将其写回。如果在处理请求时再次从数据库中获取实体,则会出现问题。

我这样做,如果:
1. 出于某种原因,我想检查原始实体的一些值。
2. 我的一些值是不可修改的,因为它们标识了实体。我将这些放在我的 View 中仅供引用,使用 DisplayFor。当然,重构模型没有这些值。我从数据库中获取原始实体,并在 Controller 中使用 TryUpdateModel 将其与 View 中的模型合并。

调用 Attach 时,出现异常“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”。

如果我使用 Context.Entry(t).CurrentValues.SetValues(t);而不是 DbSet.Attach(t); ,我得到以下异常:
Member 'CurrentValues' cannot be called for the entity of type 'Price' because the entity does not exist in the context. To add an entity to the context call the Add or Attach method of DbSet<Price>.
据我了解,具有特定键的实体有两个实例。如果有的话,我想制作我想要保存的那个,替换现在的那个。我希望这是自动的,也就是说,我不必知道是否已经存在另一个必须更换的。

有没有办法实现这一目标?

最佳答案

与此同时,我已经开始使用模型优先方法,所以我不太确定以下是否适用,但我认为其中一些可能有用。

  • 使用 someContext.someDbSet.AsNoTracking() 运行查询, 如果
    您只想查找一些数据,但不打算更新
    有变化的数据库。见 AsNoTracking在 MSDN 上。
  • 从更新中排除某些模型属性。这将帮助您更新,例如用户配置文件,不更新散列密码,存储在同一模型中。
    someContext.someDbSet.Attach(someModelInstance);
    var entry = substanceContext.Entry(someModelInstance);
    entry.State = EntityState.Modified;
    entry.Property("somePropertyToIgnore").IsModified = false;
    substanceContext.SaveChanges();

  • 如果您查看在第二个解决方案中生成的 SQL,您会注意到字段 somePropertyToIgore 从 SET 子句中被遗漏了。

    关于entity-framework - 如何在 Entity Framework 数据库第一种方法中用具有相同键的另一个实体替换实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15837526/

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