EntityFramework Code First - Проверьте, присоединен ли Entity

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

Я получаю следующее исключение:An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

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

Заранее спасибо, Radu

 Pawel08 апр. 2012 г., 09:20
Вы можете использовать метод ObjectContext.ObjectStateManager.GetObjectStateEntries () (msdn.microsoft.com/en-us/library/bb738497.aspx) чтобы получить все сущности, которые отслеживаются контекстом. Обратите внимание, что возможно, что в базе данных есть объекты, которые не отслеживаются ObjectContext. Необходимо указать состояние, чтобы ObjectStateManager знал, какие объекты вам нужны (это перечисление имеет атрибут Flags, чтобы вы могли объединять различные значения, используя |)

Ответы на вопрос(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);
        }
 10 июл. 2014 г., 01:34
Я провел некоторое тестирование производительности и (на удивление) обнаружил, что ObjectStateManager.TryGetObjectStateEntry более чем в 70 раз медленнее, чем Set & lt; TEntity & gt; (). Local.Any (
Решение Вопроса

Вы можете найти ответВот.

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);
}
 16 окт. 2015 г., 14:49
& Quot; где TContext: DbContext, TEntity: class & quot; не работал в моей системе и должен был быть заменен на "где TContext: DbContext, где TEntity: class". АКА, заменил запятую на "где"
 13 февр. 2014 г., 13:39
TContext не кажется необходимым. Пусть первый параметр будет иметь тип DbContext вместо этого - public static bool Exists & lt; TEntity & gt; (этот контекст DbContext, сущность TEntity) ...
 30 янв. 2014 г., 02:59
@Sylpheed Спасибо, я обновил ответ в соответствии с вашим предложением.
 23 февр. 2014 г., 22:53
@Palpie Ответ, который я предоставил, был для EF 4.5, поэтому DbContext в то время не существовало. Хорошее предложение, хотя.
 13 янв. 2014 г., 19:47
Благодарю. Это также помогло мне. Еще одно примечание с функцией выше. Вам нужно указать, где находится T: class, иначе компилятор будет жаловаться.

Ваш ответ на вопрос