42

EntityFramework4.3コードファーストでFK関係を持つエンティティを更新しようとしています。Entry(item).State = EntityState.Unchangedを呼び出して、関連するエンティティにアタッチしようとします。

次の例外が発生します。同じキーを持つオブジェクトがObjectStateManagerにすでに存在します。ObjectStateManagerは、同じキーを持つ複数のオブジェクトを追跡できません。

私はこれらのアイテムを更新せず、メインエンティティにそれらのidプロパティもありません。どのエンティティが接続されているかを知ることは可能ですか?

よろしくお願いします、ラドゥ

4

3 に答える 3

82

あなたはここで答えを見つけることができます。

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);
}
于 2012-09-24T22:37:15.340 に答える
9

この方法を使用できます。

    /// <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);
        }
于 2012-06-27T16:58:24.870 に答える
0

エンティティがDbContextにアタッチされ、そのエンティティがデタッチされて渡されたときに、ナビゲーションプロパティがDbSet <>。Include()句を介してデータレイヤーに入力されたEFコア遅延読み込みシナリオからここに到着した場合ビジネスレイヤーまでは、DbContext.OnConfigure(DbContextOptionsBuilder optionsBuilder)メソッドに次 optionsBuilder.ConfigureWarnings(warn => warn.Ignore(CoreEventId.LazyLoadOnDisposedContextWarning)); のようなものを追加することを検討してください。エラーは無視され、元々Include()dであった値が返されます。

于 2020-04-10T02:13:39.633 に答える