Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架4-检查是否附加了实体_C#_Entity Framework 4 - Fatal编程技术网

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

C# 实体框架4-检查是否附加了实体,c#,entity-framework-4,C#,Entity Framework 4,在NHibernate中,我们重写Equals()和GetHashCode()来计算实体相等性 实体框架中是否需要相同的功能 我问的原因是,我们正在将EF4与POCO一起使用,并且正在实现缓存层。我们遇到的问题是,在检查某个项是否已附加到对象上下文时。当前,即使实体已经存在于当前对象上下文中,该值也会计算为false。也许这段代码会给您一些想法。我不使用POCO,但我认为它们的共同点是相同的 下面是一个示例更新方法,它在执行更新例程之前检查上下文是否附加了实体 public T Update(

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

实体框架中是否需要相同的功能


我问的原因是,我们正在将EF4与POCO一起使用,并且正在实现缓存层。我们遇到的问题是,在检查某个项是否已附加到对象上下文时。当前,即使实体已经存在于当前对象上下文中,该值也会计算为false。

也许这段代码会给您一些想法。我不使用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;
  }
公共T更新(T实体)
{
如果(entity==null)抛出新的ArgumentNullException(“entity”);
var key=ObjectContext.CreateEntityKey(ObjectContext.GetEntitySet().Name,entity);
if(ObjectContext.IsAttached(键))
{
ObjectContext.ApplyCurrentValues(key.EntitySetName,entity);
}
其他的
{
ObjectContext.AttachTo(ObjectContext.GetEntitySet().Name,entity);
ObjectContext.ObjectStateManager.ChangeObjectState(实体,EntityState.Modified);
}
返回实体;
}  
内部静态EntitySetBase GetEntitySet(此ObjectContext上下文)
{
var container=context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName,DataSpace.CSpace);
var baseType=GetBaseType(typeof(tenty));
var entitySet=container.BaseEntitySets
.Where(item=>item.ElementType.Name.Equals(baseType.Name))
.FirstOrDefault();
返回实体集;
}  
内部静态bool已附加(此ObjectContext上下文,EntityKey)
{
if(key==null)
{
抛出新的ArgumentNullException(“键”);
}
ObjectStateEntry条目;
if(context.ObjectStateManager.TryGetObjectStateEntry(key,out entry))
{
返回(entry.State!=EntityState.Detached);
}
返回false;
}
私有静态类型GetBaseType(类型)
{
var baseType=type.baseType;
if(baseType!=null&&baseType!=typeof(EntityObject))
{
返回GetBaseType(type.BaseType);
}
返回类型;
}

希望这能帮你一点忙。=)

也许这段代码会给你一些想法。我不使用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;
  }
公共T更新(T实体)
{
如果(entity==null)抛出新的ArgumentNullException(“entity”);
var key=ObjectContext.CreateEntityKey(ObjectContext.GetEntitySet().Name,entity);
if(ObjectContext.IsAttached(键))
{
ObjectContext.ApplyCurrentValues(key.EntitySetName,entity);
}
其他的
{
ObjectContext.AttachTo(ObjectContext.GetEntitySet().Name,entity);
ObjectContext.ObjectStateManager.ChangeObjectState(实体,EntityState.Modified);
}
返回实体;
}  
内部静态EntitySetBase GetEntitySet(此ObjectContext上下文)
{
var container=context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName,DataSpace.CSpace);
var baseType=GetBaseType(typeof(tenty));
var entitySet=container.BaseEntitySets
.Where(item=>item.ElementType.Name.Equals(baseType.Name))
.FirstOrDefault();
返回实体集;
}  
内部静态bool已附加(此ObjectContext上下文,EntityKey)
{
if(key==null)
{
抛出新的ArgumentNullException(“键”);
}
ObjectStateEntry条目;
if(context.ObjectStateManager.TryGetObjectStateEntry(key,out entry))
{
返回(entry.State!=EntityState.Detached);
}
返回false;
}
私有静态类型GetBaseType(类型)
{
var baseType=type.baseType;
if(baseType!=null&&baseType!=typeof(EntityObject))
{
返回GetBaseType(type.BaseType);
}
返回类型;
}

希望这能帮你一点忙。=)

有两个可读性技巧可以帮助我做到这一点,那就是在成员属性上使用“this”,而不是将属性命名为与其类型相同的属性。我花了一点时间才意识到“ObjectContext”是一个属性。有两个可读性技巧可以帮助我做到这一点,那就是在成员属性上使用“this”,而不是将属性命名为与其类型相同的属性。我花了一点时间才意识到“ObjectContext”是一种属性。