在NHibernate中,我们重写Equals()和GetHashCode()来计算实体相等性。
在实体框架中是否有必要?
我问的原因是我们正在使用EF4和POCO,并且正在实施缓存层。我们遇到的问题是检查项目是否已附加到对象上下文。目前,即使实体已存在于当前对象上下文中,此计算结果为false。
答案 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;
}
希望这可以帮助你一点=)