热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解决多对一关系中添加成功但无法删除的问题

本文探讨了在一个多对一关系中保存和删除对象时遇到的问题,并提供了解决方案。具体问题表现为能够成功添加对象,但在尝试删除时,虽然对象从集合中移除,但更改未同步到数据库。

在处理多对一关系时,保存和删除对象的过程中遇到了一个特定问题:虽然能够成功将对象添加到关系中,但在尝试删除对象时,尽管对象已从集合中移除,但这些更改并未反映在数据库中。


以下是相关的代码示例:


[System.Web.Http.HttpPost]
public void FollowPerson(int personId, int companyId)
{
var uow = new Uow();
var person = uow.People.GetById(personId);
var company = uow.Companies.GetById(companyId);

company.People.Add(person);
uow.Companies.Update(company);
}

[System.Web.Http.HttpDelete]
public void UnFollowPerson(int personId, int companyId)
{
var uow = new Uow();
var person = uow.People.GetById(personId);
var company = uow.Companies.GetById(companyId);

company.People.Remove(person);
uow.Companies.Update(company);
}

上述代码中,FollowPerson方法用于向公司中添加人员,而UnFollowPerson方法用于从公司中删除人员。问题在于UnFollowPerson方法未能将删除操作持久化到数据库。


为了更好地理解这个问题,我们需要查看Update方法的实现:


public void Update(Company company)
{
var compToUpate = DbSet.FirstOrDefault(c => c.Id == company.Id);
DbContext.Entry(compToUpate).CurrentValues.SetValues(company);
DbContext.SaveChanges();
}

此方法尝试通过更新公司的当前值来同步更改。然而,当涉及到集合(如People)时,这种方法可能不足以触发数据库中的更改检测。


为了解决这一问题,可以考虑使用以下方法来确保删除操作被正确地应用到数据库:


var company = uow.Companies.Include(c => c.People).FirstOrDefault(c => c.Id == companyId);
if (company != null)
{
var persOnToRemove= company.People.FirstOrDefault(p => p.Id == personId);
if (personToRemove != null)
{
company.People.Remove(personToRemove);
uow.Companies.Update(company);
}
}

这里的关键在于使用Include方法显式加载相关实体,确保在执行删除操作时,所有必要的数据都已加载到内存中。此外,检查待删除的对象是否存在于集合中,可以避免不必要的错误。


Entity Framework (EF) 在处理复杂关系时有时会显得有些棘手,因此确保所有相关数据都被正确加载和管理是非常重要的。


推荐阅读
  • 本文将详细介绍如何使用ViewPager实现多页面滑动切换,并探讨如何去掉其默认的左右切换动画效果。ViewPager是Android开发中常用的组件之一,用于实现屏幕间的内容切换。 ... [详细]
  • 使用 NDB 提升 Node.js 应用调试体验
    本文介绍了由 Google Chrome 实验室推出的新一代 Node.js 调试工具 NDB,旨在为开发者提供更加高效和便捷的调试解决方案。 ... [详细]
  • 本文详细探讨了 Java 中 Daemon 线程的特点及其应用场景,并深入分析了 Random 类的源代码,帮助开发者更好地理解和使用这些核心组件。 ... [详细]
  • 本文档详细介绍了服务器与应用系统迁移的策略与实施步骤。迁移不仅涉及数据的转移,还包括环境配置、应用兼容性测试等多个方面,旨在确保迁移过程的顺利进行及迁移后的系统稳定运行。 ... [详细]
  • 本文详细介绍了Java中`org.sakaiproject.site.api.Site.addPage()`方法的功能和使用方法,并提供了多个实际项目中的代码示例。 ... [详细]
  • 本文介绍了使用Node.js开发超市管理系统的经验分享,重点讨论了项目中使用的技术栈及其实现细节,包括前端Bootstrap和后端Express框架的应用,以及MongoDB数据库的操作。 ... [详细]
  • 本章深入探讨了如何在JavaScript游戏中有效地管理和使用图像(精灵)及声音资源,包括加载、绘制和播放等关键步骤。 ... [详细]
  • 本文探讨了如何在Django中创建一个能够根据需求选择不同模板的包含标签。通过自定义逻辑,开发者可以在多个模板选项中灵活切换,以适应不同的显示需求。 ... [详细]
  • JavaScript 实现购物商城商品图片放大功能
    本文介绍了如何使用 JavaScript 和 CSS 实现购物商城中商品图片的放大功能,解决了图片放大时文字位置变化的问题,并提供了详细的代码示例。 ... [详细]
  • 深入浅出:Java面向对象编程
    本文详细介绍了Java语言的核心特性——面向对象编程。探讨了Java的基本概念、平台无关性、丰富的内置类库及安全性,同时深入解析了类加载器、垃圾回收机制以及基本数据类型和其包装类。 ... [详细]
  • 本文通过一个具体的用户管理项目,详细介绍如何使用Spring MVC框架进行开发。从用户实体类的设计到控制器的实现,再到视图层的展示,全面解析Spring MVC的核心功能与实现细节。 ... [详细]
  • 解决Linux Ubuntu下Ping IP正常但无法Ping域名的问题
    本文介绍了在Linux Ubuntu系统中遇到的一种常见问题——能够Ping通IP地址,但无法Ping通域名,并提供了有效的解决方案。 ... [详细]
  • 本文介绍了如何从给定的JSON响应中正确地提取产品标题等信息。 ... [详细]
  • 本文详细介绍了RPM包构建过程中Spec文件的结构和各部分的作用,包括包描述、准备阶段、构建过程、安装步骤、清理操作以及文件列表等关键环节。同时,提供了关于RPM宏命令、打包目录结构及常见标签的深入解析。 ... [详细]
  • 本文介绍了如何有效解决在Java编程中遇到的 'element cannot be mapped to a null key' 错误,通过具体的代码示例展示了问题的根源及解决方案。 ... [详细]
author-avatar
zoey小
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有