0
是否有可能獲得已知持久對象的引用沒有DB往返,就像使用NHibernate使用ISession.Load(id)
一樣?在沒有數據庫調用的情況下獲取持久實體引用
是否有可能獲得已知持久對象的引用沒有DB往返,就像使用NHibernate使用ISession.Load(id)
一樣?在沒有數據庫調用的情況下獲取持久實體引用
是的,如果對象已經加載是可能的。在EF未來CTP5的情況下,你可以使用DbSet<T>
實例的新Local
屬性:
var entity = context.MySet.Local.SingleOrDefault(e => e.Id == id);
在ObjectContext
形勢還是比較複雜的情況下 - 你需要EntityKey
情況下這是麻煩的獲得與波蘇斯工作時。我的倉庫代碼
部分:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
{
private readonly EntitySetBase _entitySet;
private readonly string _entitySetName;
protected BaseObjectContext Context { get; set; }
protected ObjectSet<TEntity> ObjectSet { get; set; }
public Repository(BaseObjectContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
Context = context;
ObjectSet = context.CreateObjectSet<TEntity>();
var container = Context.MetadataWorkspace
.GetEntityContainer(Context.DefaultContainerName, DataSpace.CSpace);
_entitySet = container.BaseEntitySets
.Single(es => es.ElementType.Name == typeof (TEntity).Name);
_entitySetName = Context.DefaultContainerName + "." + _entitySet.Name;
}
public virtual IQueryable<TEntity> GetQuery()
{
return ObjectSet;
}
public virtual TEntity GetById(long id)
{
TEntity entity = TryGetLocalEntity(id);
if (entity == null)
{
entity = GetQuery().SingleOrDefault(o => o.Id == id);
}
return entity;
}
private TEntity TryGetLocalEntity(long id)
{
if (_entitySet == null)
{
return null;
}
var key = new EntityKey(_entitySetName, "Id", id);
ObjectStateEntry entry;
if (Context.ObjectStateManager.TryGetObjectStateEntry(key, out entry))
{
return (TEntity) entry.Entity;
}
return null;
}
}
如果未加載的情況下,你根本無法獲得而無需查詢DB參考。您可以使用虛擬對象創建。
CTP5例如:
var entity = new MyEntity { Id = id };
context.MySet.Attach(entity);
純EF4例如:
var entity = new MyEntity { Id = id };
context.Attach(entity);
或具有代理創建(CTP5例如)虛擬對象:
CTP5例如:
var entity = context.MySet.Create();
enity.Id = id;
純EF4考試ple:
var entity = context.CreateObject<MyEntity>();
entity.Id = id;
如果它在緩存中? – OrangeDog 2011-02-02 22:43:56
@OrangeDog假設它不是 – 2011-02-02 22:52:59