2010-09-23 88 views
1

在NHibernate中,我們重寫Equals()和GetHashCode()來計算實體相等性。實體框架4 - 檢查實體是否連接

實體框架中是否需要相同?

我問的原因是我們正在使用EF4和POCO,並且正在實施一個緩存層。我們遇到的問題是在檢查項目是否已經附加到對象上下文時。目前,即使實體已經存在於當前對象上下文中,它也會評估爲false。

回答

1

也許這段代碼會給你一些想法。我不使用POCO,但我認爲常見的點是相同的。

下面是示例更新方法,該方法在執行更新例程之前檢查上下文是否已附加實體。

public T Update(T entity) 
{ 
     if (entity == null) throw new ArgumentNullException("entity"); 
     var key = ObjectContext.CreateEntityKey(ObjectContext.GetEntitySet<T>().Name, entity); 
     if (ObjectContext.IsAttached(key)) 
     { 
      ObjectContext.ApplyCurrentValues(key.EntitySetName, entity); 
     } 
     else 
     { 
      ObjectContext.AttachTo(ObjectContext.GetEntitySet<T>().Name, entity); 
      ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); 
     } 
     return entity; 
} 



internal static EntitySetBase GetEntitySet<TEntity>(this ObjectContext context) 
{ 
     var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace); 
     var baseType = GetBaseType(typeof(TEntity)); 
     var entitySet = container.BaseEntitySets 
       .Where(item => item.ElementType.Name.Equals(baseType.Name)) 
       .FirstOrDefault(); 

     return entitySet; 
} 

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


    private static Type GetBaseType(Type type) 
    { 
     var baseType = type.BaseType; 
     if (baseType != null && baseType != typeof(EntityObject)) 
     { 
      return GetBaseType(type.BaseType); 
     } 
     return type; 
    } 

希望這可以幫助你有點=),這將幫助我爲這個

+1

兩個可讀性提示,將使用「本」成員屬性,而不是命名的屬性與它們的類型。我花了一點才意識到'ObjectContext'是一個屬性。 – jcmcbeth 2013-06-21 14:14:10