实体框架4 - 检查是否附加了实体

时间:2010-09-23 13:30:34

标签: c# entity-framework-4

在NHibernate中,我们重写Equals()和GetHashCode()来计算实体相等性。

在实体框架中是否有必要?

我问的原因是我们正在使用EF4和POCO,并且正在实施缓存层。我们遇到的问题是检查项目是否已附加到对象上下文。目前,即使实体已存在于当前对象上下文中,此计算结果为false。

1 个答案:

答案 0 :(得分:1)

也许这段代码会给你一些想法。我没有使用POCO,但我认为共同点是一样的。

以下是示例Update方法,该方法在执行更新例程之前检查Context是否附加了实体。

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

希望这可以帮助你一点=)