1
在NHibernate中,我們重寫Equals()和GetHashCode()來計算實體相等性。實體框架4 - 檢查實體是否連接
實體框架中是否需要相同?
我問的原因是我們正在使用EF4和POCO,並且正在實施一個緩存層。我們遇到的問題是在檢查項目是否已經附加到對象上下文時。目前,即使實體已經存在於當前對象上下文中,它也會評估爲false。
在NHibernate中,我們重寫Equals()和GetHashCode()來計算實體相等性。實體框架4 - 檢查實體是否連接
實體框架中是否需要相同?
我問的原因是我們正在使用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;
}
希望這可以幫助你有點=),這將幫助我爲這個
兩個可讀性提示,將使用「本」成員屬性,而不是命名的屬性與它們的類型。我花了一點才意識到'ObjectContext'是一個屬性。 – jcmcbeth 2013-06-21 14:14:10