Подтвердить что ты не робот

Код EntityFramework Сначала - проверьте, привязан ли Entity

Я пытаюсь обновить сущность с отношениями FK в EntityFramework 4.3 Code First. Я пытаюсь подключиться к связанным с ним причинам, вызывая: Entry (item).State = EntityState.Unchanged

Я получаю следующее исключение: Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.

Я не обновляю эти элементы и не имею свойство id для них на моем основном объекте. Можно ли узнать, какие объекты прикреплены или нет?

Спасибо заранее, Radu

4b9b3361

Ответ 1

Здесь вы можете найти ответ .

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);
}

Ответ 2

Вы можете использовать этот метод:

    /// <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);
        }