2012-04-05 16 views
19

EntityFramework 4.3 İlk Kodunda FK ilişkisi olan bir varlığı güncelleştirmeye çalışıyorum. Ben arayarak ilgili entites eklemek için deneyin: Giriş (item) .State = EntityState.UnchangedEntityFramework Kodu İlk - Varlığın ekli olup olmadığını kontrol edin

Ben şu istisna olsun: Aynı anahtara sahip bir nesne zaten ObjectStateManager var . ObjectStateManager, aynı anahtarla birden fazla nesneyi izleyemez.

Bu öğeleri güncelleştirmem ya da ana öğem için bunlara ait bir kimlik özelliğine sahip değilim. Hangi varlıkların eklendiğini veya eklenemediğini bilmek mümkün mü? peşin

sayesinde

Radu bu yöntemi kullanabilirsiniz
+0

Sen bağlamda tarafından izlenir tüm varlıkları almak için ObjectContext.ObjectStateManager.GetObjectStateEntries() yöntemini (http://msdn.microsoft.com/en-us/library/bb738497.aspx) kullanabilir. Bu, ObjectContext tarafından izlenen veritabanında varlıklar olduğunu mümkün olduğunu unutmayın. ObjectStateManager'ın hangi varlıklara ihtiyaç duyduğunu bilmesi için bir durum sağlamanız gerekir (bu enumlar Flags niteliğine sahiptir, böylece |) değerleri kullanarak farklı değerleri birleştirebilirsiniz.) – Pawel

cevap

42

Cevabı here bulabilirsiniz: Örneğin

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

.

public bool Exists<T>(T entity) where T : class 
{ 
    return this.Set<T>().Local.Any(e => e == entity); 
} 

Bu kodu içeriğinize yerleştirin veya böyle bir uzantıya dönüştürebilirsiniz.

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

Teşekkürler. Bu da bana yardımcı oldu. Yukarıdaki işlevle birlikte bir başka not. T: sınıfını ya da derleyicinin şikayet edeceği yere koymalısınız. – Sylpheed

+0

@Sylpheed Teşekkürler, cevabı güncelledim önerinize göre –

+0

TContext gerekli görünmüyor. İlk parametre DbContext türünde olsun - public static bool var (bu DbContext içeriği, TEntity varlık) ... –

5

:

 if (!_objectContext.IsAttached(entity.EntityKey)) 
     { 
      _objectContext.Attach(entity); 
     } 
+3

Bazı performans testleri yaptım ve (şaşırtıcı bir şekilde) ObjectStateManager.TryGetObjectStateEntry'nin 70 kat daha yavaş olduğunu buldum. Set () .Local.Any ( – Brent

İlgili konular