我正在尝试在 EntityFramework 4.3 Code First 中更新具有 FK 关系的实体。我尝试通过调用附加到相关实体: Entry(item).State = EntityState.Unchanged
我得到以下异常:ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。
我没有更新这些项目,也没有在我的主要实体上为它们提供 id 属性。是否有可能知道哪些实体已附加或不附加?
在此先感谢,拉杜
我正在尝试在 EntityFramework 4.3 Code First 中更新具有 FK 关系的实体。我尝试通过调用附加到相关实体: Entry(item).State = EntityState.Unchanged
我得到以下异常:ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。
我没有更新这些项目,也没有在我的主要实体上为它们提供 id 属性。是否有可能知道哪些实体已附加或不附加?
在此先感谢,拉杜
你可以在这里找到答案。
public bool Exists<T>(T entity) where T : class
{
return this.Set<T>().Local.Any(e => e == entity);
}
将该代码放入您的上下文中,或者您可以将其转换为类似的扩展。
public static bool Exists<TContext, TEntity>(this TContext context, TEntity entity)
where TContext : DbContext
where TEntity : class
{
return context.Set<TEntity>().Local.Any(e => e == entity);
}
您可以使用此方法:
/// <summary>
/// Determines whether the specified entity key is attached is attached.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="key">The key.</param>
/// <returns>
/// <c>true</c> if the specified context is attached; otherwise, <c>false</c>.
/// </returns>
internal static bool IsAttached(this ObjectContext context, EntityKey key)
{
if (key == null)
{
throw new ArgumentNullException("key");
}
ObjectStateEntry entry;
if (context.ObjectStateManager.TryGetObjectStateEntry(key, out entry))
{
return (entry.State != EntityState.Detached);
}
return false;
}
例如:
if (!_objectContext.IsAttached(entity.EntityKey))
{
_objectContext.Attach(entity);
}
如果您是从 EF Core 延迟加载场景到达这里的,在该场景中,导航属性通过 DbSet<>.Include() 子句填充到数据层中,而实体附加到 DbContext,然后该实体被分离并传递直到业务层,请考虑在您的 DbContext.OnConfiguring(DbContextOptionsBuilder optionsBuilder) 方法中添加类似的内容:
optionsBuilder.ConfigureWarnings(warn => warn.Ignore(CoreEventId.LazyLoadOnDisposedContextWarning));
错误将被忽略并返回最初的 Include()d 值。