作者:zoey小 | 来源:互联网 | 2024-12-02 12:26
本文探讨了在一个多对一关系中保存和删除对象时遇到的问题,并提供了解决方案。具体问题表现为能够成功添加对象,但在尝试删除时,虽然对象从集合中移除,但更改未同步到数据库。
在处理多对一关系时,保存和删除对象的过程中遇到了一个特定问题:虽然能够成功将对象添加到关系中,但在尝试删除对象时,尽管对象已从集合中移除,但这些更改并未反映在数据库中。
以下是相关的代码示例:
[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) 在处理复杂关系时有时会显得有些棘手,因此确保所有相关数据都被正确加载和管理是非常重要的。