热门标签 | 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) 在处理复杂关系时有时会显得有些棘手,因此确保所有相关数据都被正确加载和管理是非常重要的。


推荐阅读
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社区 版权所有