SaveChanges() 实体框架 4.1 的问题

2024-01-03

我在保存对数据库的更改时遇到问题。

我正在控制器中更新模型 A,但是当我使用 SaveChanges() 保存更改时,我最终在 B 的数据库中出现了重复的项目。

调用 UpdateModel() 后,我检查了 Bs 属性,它正如我所预期的那样,但是在调用 SaveChanges() 后,如果我检查 Bs 属性,我将看到 Id 完全不同(新 Id 和新条目)。

我的课程与此类似:

public class A
{
    [HiddenInput(DisplayValue = false)]
    public int AId { get; set; }

    public string Name { get; set; }

    public virtual ICollection<B> Bs{ get; set; }
}

public class B
{
    [HiddenInput(DisplayValue = false)]
    public int BId { get; set; }

    public string Name { get; set; }

    public virtual ICollection<A> As{ get; set; }
}

我的控制器是这样的:

    [HttpPost]
    public ActionResult Edit(A theA)
    {
        try
        {
           db.Entry(theA).State = EntityState.Modified;

           foreach (var item in theA.Bs)
           {
               db.Entry(item).State = EntityState.Modified;
           }

           db.SaveChanges();

           return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

难道我做错了什么 ?

提前致谢


这是常见的行为。问题是 EF 不知道您附加了现有的B所以它会自动插入一条新记录。你必须说 EFB通过调用以下命令可以找到现有的:

// here add B to the collection in the A and after that call:
dbContext.Entry<B>(someB).State = EntityState.Unchanged();

或通过附加B在将其添加到集合之前A(我不确定使用时这是否可行UpdateModel在 ASP.NET MVC 中)。

dbContext.Bs.Attach(someB);
// now add B to the collection in the A

另一种可能性是加载B首先从数据库中将加载的对象添加到集合中A但这是到数据库的额外往返。

int id = someB.Id;
var loadedB = dbCotnext.Bs.Single(b => b.Id == id);
someA.Bs.Add(loadedB);
dbContext.As.Add(someA);
dbContext.SaveChanges();

结论:每次你打电话Add整个对象图将被跟踪为已插入,除非您首先附加相关实体(在将它们添加到插入的父级之前 - 第二个和第三个示例),或者除非您在添加父级后手动将相关实体的状态更改回不变。 (第一个例子)。

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

SaveChanges() 实体框架 4.1 的问题 的相关文章

  • 基于标签的 SQL 查询

    我已经有一段时间没有做过任何 SQL 了 我不确定这个问题是否有一个简单的解决方案 我也有点菜鸟 我正在尝试构建一个图像库 允许用户使用标签来搜索图像 然后单击其他标签来优化搜索并减少结果数量 但我在所涉及的查询方面遇到了大问题 这是我当前
  • 使用嵌套属性的 Rails 中多对多关系的下拉菜单

    我通过多对多关联有三个表 超市 产品和供应 每个超市可以存放多种产品 每种产品可以在多个超市销售 该关联是通过供应模型建立的 超级市场 class Supermarket lt ActiveRecord Base attr accessib
  • 多选编辑表单选定值

    在 Laravel 4 中遇到一个问题时 在 联系人 模型编辑表单中 我可以获得所有字段的当前值 除了用于与另一个模型 公司 建立关系的多重选择的字段值 这是一种多对多的关系 我正在获取公司列表 但即使存在关系 也没有选择任何公司 这是我的
  • 如何让 EF 将空字符串保留为 NULL?

    在我的域中 NULL 和空字符串之间没有重要区别 如何让 EF 忽略两者之间的差异并始终将空字符串保留为 NULL 空字符串不是字符串属性的默认值 因此这意味着您的代码正在某处设置空字符串 在这种情况下 您有责任处理 如果您在 POCO 中
  • hibernate ManyToMany 与可连接的顺序

    我有以下数据库设置 T PARTICIPANT MOVEMENT ParticipantMove SID BigInt PK Participant SID BigInt FK MoveType SID BigInt FK MoveReas
  • 用户、组和角色的多对多声明式 SQLAlchemy 定义

    我是 SQLAlchemy 的新手 想知道定义此类表和关系的最佳方法是什么 我希望能够通过以下方式访问用户组user groups 分组中的用户group users 并找出用户在组中的角色 我假设将在关联模型中定义逻辑 我还想按组选择所有
  • MVC3 和 EF 数据优先:最佳实践是什么?

    似乎 MVC3 和 EF4 1 的大部分焦点都围绕 代码优先 我似乎找不到任何满足以下条件的示例或教程 使用现有的 SQLServer 数据库 有单独的网络和数据访问项目 我们将有多个网络应用程序共享相同的数据访问类 验证建议 是否存在这样
  • 保存实体会导致重复插入到查找数据中

    我使用 EF 4 1 代码优先 来创建我的数据库和对象 Given public class Order public int Id get set public string Name get set public virtual Ord
  • EF Core 5.0 中的多对多关系是否可以配置为仅保留一个导航属性(在一侧)?

    我已使用以下代码配置了 DbContext EF Core 5 0 protected override void OnModelCreating ModelBuilder modelBuilder modelBuilder Entity
  • EF Code First DBContext 和事务

    我想知道实现交易的最佳方式是什么DBContext 尤其 Does DbContext SaveChanges如果我更改多个实体 请在内部实施交易 如果我想打电话DbContext SaveChanges多次 相同上下文 不同上下文 如何实
  • 在 SQL Server 中实现一对零或一关系

    我正在使用 Entity Framework 4 1 数据库第一种方法 我使用过旧数据库 在我的 edmx 文件中 它根据旧数据库中的表创建实体类 有一个一对零或一某些实体之间的关联 尽管我探索了数据库表以及它们之间的关系 但我不知道如何一
  • 实体框架 4.1:重写 IEnumerable 验证

    public abstract class Animal IValidatableObject public string Id get set public string Name get set public virtual IEnum
  • 在 RDBMS 中何时使用三元关系而不是聚合?

    我想知道什么时候可以表示实体集和三元关系之间的关系 我明白聚合的好处 但是如果实体集和关系集之间的关系中没有属性 为什么还要使用聚合呢 例如 一名研究生 具有学生编号和姓名 正在从事一个项目 具有 pid 开始日期和结束日期 并且学生从事的
  • Django 如何从 ManyToManyField 序列化并列出全部

    我正在使用 Django 1 9 1 开发移动应用程序后端 我实现了关注者模型 现在我想列出用户的所有关注者 但目前我不得不这样做 我还使用 Django Rest 框架 这是我的 UserProfile 模型 class UserProf
  • Spring Data Jpa项目使用ManyToMany关系时生成查询

    我有以下实体映射 Entity Table name books public class Book implements Serializable ManyToMany JoinTable name books2categories jo
  • 如何查询多对多表(一个表的值成为列标题)

    给定此表结构 我想展平多对多关系 并将一个表的名称字段中的值设置为列标题 并将同一表中的数量设置为列值 目前可行的想法是将值放入字典 哈希表 中并用代码表示这些数据 但我想知道是否有 SQL 方法可以做到这一点 我还使用 Linq to S
  • 多对多关系更新:无法插入重复键

    首先我还是 EF 代码新手 所以请宽容我 我有这些实体类 public class User public int UserId get set public string UserName get set public string Em
  • 更改代码使用指针实现多对多关系

    我在 Movie hpp 中有以下代码 ifndef MOVIE H define MOVIE H class Movie private std string title public std string getTitle const
  • C# 实体框架我们应该使用 POCO.Id 还是仅使用 POCO 设置关系?

    我在服务方法中遇到一种情况 将 POCO 分配为另一个 POCO 的子对象无法按预期工作 我正在使用实体框架 4 public void ChangeOrderCurrency Currency currency order Currenc
  • 实体框架在多对多更新场景中附加问题

    我有一个场景 我希望更新电影实体及其与流派的多对多关系 导航属性Genres电影中包含存根Genre只包含的对象GenreID因为我想节省查询所有流派的数据库 请参阅下面的代码 其相当不言自明 问题是我需要将 存根 流派附加到上下文 以便

随机推荐

  • 重置 DBUnit 中的序列?

    我想在 Java DBUnit 中的每次测试后重置数据库 AND 序列 我已经看到这个问题 但没有我正在努力获得的代码解决方案 如何在DBUnit中使用Oracle序列号 https stackoverflow com questions
  • 在 ruby​​ 类中调用 Knife

    我想围绕刀创建一个很好的包装类 以允许程序以可读的方式运行刀命令 我目前正在尝试使用 Chef gem 中的 Knife rb 文件作为取得成功的指南 但是 我在关闭编辑器时遇到问题 如果我运行以下代码 require chef knife
  • 过滤数据集

    我有一个充满客户的数据集 我想知道是否有任何方法可以过滤数据集并仅获取我想要的信息 例如 要得到CostumerName and CostumerAddress对于有的客户CostumerID 1 是否可以 您可以使用DataTable S
  • Twitter Bootstrap - 如何根据 @media 定义的宽度更改 css 类

    这是我的第一个问题 但我只想说这个网站多年来帮助了我无数次 我想我已经到了有自己的问题要问的阶段了 抱歉 如果问题不清楚 我会尝试详细说明 我已经为我的一些元素分配了一个过渡 这样当它们悬停在上面时它们就会向上升起 即 example ho
  • Python 使用 Beautiful Soup 对特定内容进行 HTML 处理

    所以当我决定解析网站的内容时 例如 http allrecipes com Recipe Slow Cooker Pork Chops II Detail aspx http allrecipes com Recipe Slow Cooke
  • 如何在 Python 中处理命令行参数? [复制]

    这个问题在这里已经有答案了 如果我期望像 001 或 999 这样的东西 这次让我们将期望限制在 001 999 范围 并且传递的其他参数很少 并且希望忽略任何意外的参数 那么处理命令行参数的简单表达式是什么 我知道 例如 如果我需要查明
  • Facebook 身份验证对话框(JS SDK)返回空白屏幕

    我正在设置一个 Rails 应用程序并尝试通过 Facebook JS SDK 实现登录 已经缺少 Omniauth 无论如何 发生的情况是弹出对话框 用户提供登录信息 但随后它重定向到https www facebook com conn
  • 如何使用服务帐户访问 GSuite 电子邮件帐户的 GMAIL API

    我希望我的服务帐户能够模拟 GSuite 中的用户之一 我有 通过 GCP 创建项目 在项目中启用GMail API 向该项目添加了一个服务帐户 启用了domain wide delegation在服务帐户设置中GCP 添加了一个API C
  • .Net 中的缓存和 WebBrowser 控件

    我正在使用 Net 中的 WebBrowser 控件来执行一些第三方联属营销转换 我在数据库中有一个队列表 其中包含要执行的所有脚本 图像 我使用 WebBrowser 控件在 WinForms 应用程序中循环遍历所有这些内容 执行脚本 图
  • 使用 bash 命令结果设置 ant 属性

    我怎样才能设置antproperty 的值是 bash 脚本执行的结果 例如 我需要有一个利用的目标svn and bash实用程序以控制构建执行 更具体地说 我尝试创建的目标将用于定义通过命令部署的应用程序中是否有修改的文件 svn st
  • 使用 auto 的模板函数重载解析

    具有以下 3 个重载 template
  • 将 UITableView 滑动到屏幕上,继续滑动?

    我想要一个从屏幕外开始并可以在屏幕上滚动 到达顶部并继续滚动的表格视图 我在下面制作了所需交互的视觉效果 我尝试过两件事 但都没有完全按照我的需要工作 我做的第一件事是将表视图放入滚动视图中 并在表视图上检测到平移时移动滚动视图 这会阻止桌
  • Parsley.js - 仅验证数字的可选输入

    我有一个表单 其中有 1 个可选输入和 3 个必填输入字段 对于可选输入 我有以下标记
  • 在 Meteor 中配置 Iron 路由器 - React

    使用 Meteor 1 2 0 1 和 React 我的简单应用程序运行良好 但现在我需要铁路由器 https github com iron meteor iron router 应用程序布局 client app jsx lib rou
  • Emmet - 带缩写的换行 - 表示换行文本的令牌,即{原始文本}

    我正在尝试尽可能惰性地将 URL 列表转换为 HTML 链接 www annaandsally com au www babylush com au www babysgotstyle com au etc 使用缩写形式的wrapper 我
  • WebWorkers 的执行速度似乎比主线程慢得多

    我一直致力于优化一些长时间运行的 JAvaScript 并尝试实现 WebWorkers 我有一组独立的任务需要计算 在我最初的测试中 有 80 个任务 在主线程上完成需要 250 毫秒 我认为我可以将任务分配给一些网络工作人员 并将时间缩
  • Hibernate 中的枚举

    在 DAO 中拥有一个其值来自 Java 枚举的字段通常很有用 一个典型的示例是登录 DAO 其中通常有一个将用户特征描述为 NORMAL 或 ADMIN 的字段 在 Hibernate 中 我将使用以下 2 个对象以 半 类型安全的方式表
  • C++ 实验/文件系统remove_all

    我想删除 C 17 中包含子文件夹和文件的文件夹 我在用着experimental filesystem namespace filesys std experimental filesystem uintmax t n filesys r
  • 在Android 8.1中访问WallpaperManager

    我正在构建一个启动器 需要访问用户当前的背景壁纸 但每次启动应用程序时都会收到警告W WallpaperManager No permission to access wallpaper suppressing exception to a
  • SaveChanges() 实体框架 4.1 的问题

    我在保存对数据库的更改时遇到问题 我正在控制器中更新模型 A 但是当我使用 SaveChanges 保存更改时 我最终在 B 的数据库中出现了重复的项目 调用 UpdateModel 后 我检查了 Bs 属性 它正如我所预期的那样 但是在调