Entity Framework 4 - проверка того, подключен ли объект - PullRequest
1 голос
/ 23 сентября 2010

В NHibernate мы переопределяем Equals () и GetHashCode () для вычисления равенства сущностей.

То же самое необходимо в Entity Framework?

Причина, по которой я спрашиваю, состоит в том, что мы используем EF4 с POCO и в настоящее время внедряем уровень кэширования. Проблема, с которой мы сталкиваемся, заключается в проверке, не связан ли элемент с контекстом объекта. В настоящее время это значение равно false, даже если объект уже существует в текущем контексте объекта.

1 Ответ

1 голос
/ 26 ноября 2010

Может быть, этот код даст вам некоторые идеи. Я не использую 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;
  }

Надеюсь, это поможет вам немного =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...