gpt4 book ai didi

c# - Entity Framework 5 问题删除 - 对象状态管理器问题

转载 作者:行者123 更新时间:2023-11-30 20:51:02 25 4
gpt4 key购买 nike

当我尝试删除实体时出现以下错误:

"An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key."

我已阅读此处与此错误相关的其他帖子,并尝试分离过滤器但没有成功。也许我遗漏了一些简单的东西或者应该使用不同的方法来删除这些过滤器(我已经尝试过删除方法)?任何帮助将不胜感激。

这是代码:我使用的是 ASP.NET 4.5 和 EF 5。它所在的简单存储库类有一个私有(private) dbContext,它在存储库构造函数中初始化并在析构函数中销毁。

namespace AuditLog.Repositories
{
public class FilterSetRepository : IFilterSetRepository
{
private readonly AuditLogEntities _ctx;

/// <summary>
/// Default constructor
/// </summary>
public FilterSetRepository()
{
_ctx = new AuditLogEntities();
}

/// <summary>
/// Destructor
/// </summary>
~FilterSetRepository()
{
_ctx.Dispose();
}

错误在 foreach 循环内具有 _ctx.Entry(filter).State = EntityState.Deleted; 的行上抛出(如下)。名为 FilterSet 的实体有一个 Filter 实体列表,在我删除 FilterSet 之前必须从它们的表中删除这些实体。如有必要,我可以提供显示它们的类代码。就在有问题的行上方,我尝试了分离方法,但它说它无法分离,因为尚未附加 key 。

/// <summary>
/// Delete a particular filter set and its filters.
/// </summary>
/// <param name="filterSet">The filter set to be deleted.</param>
public void DeleteFilterSet(FilterSet filterSet)
{
// First delete the child elements
var filterRepository = new FilterRepository();
foreach (var filter in filterRepository.GetFiltersBySets(filterSet))
{
_ctx.Entry(filter).State = EntityState.Deleted;
_ctx.SaveChanges();
}

// ...then delete the filter set
_ctx.Entry(filterSet).State = EntityState.Deleted;
_ctx.SaveChanges();
}

预先感谢您的帮助!

最佳答案

看完这篇post我再次能够修改我的 DeleteFilterSet 代码以查找和处理其键已被对象状态管理器跟踪的对象。这是有效的代码:

/// <summary>
/// Delete a particular filter set and its filters.
/// </summary>
/// <param name="filterSet">The filter set to be deleted.</param>
public void DeleteFilterSet(FilterSet filterSet)
{
// First delete the child elements
var filterRepository = new FilterRepository();

foreach (var filter in filterRepository.GetFiltersBySets(filterSet))
{
var entry = _ctx.Entry(filter);

if (entry.State==EntityState.Detached)
{
var set = _ctx.Set<Filter>();
Filter attachedEntity = set.Local.SingleOrDefault(e => e.FilterId == filter.FilterId);

if (attachedEntity!=null)
{
var attachedEntry = _ctx.Entry(attachedEntity);
attachedEntry.State=EntityState.Deleted;
}
else
{
entry.State = EntityState.Deleted;
}
}
_ctx.SaveChanges();
}

// ...then delete the filter set
_ctx.FilterSets.Remove(filterSet);
_ctx.SaveChanges();
}

我希望这个解决方案对其他人有帮助。

关于c# - Entity Framework 5 问题删除 - 对象状态管理器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22106545/

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