我需要找出给定EntityCollection<T>
的所有者是否与Context分离。原因是为了避免对集合的后续Load()调用失败。但是,无法访问集合的_ owner
和_ wrappedOwner
字段,并且所有可用元数据似乎都不提供此信息。
有没有办法找出所有者(或者至少是它的EntityState)?
上下文:由于我们不允许通过策略使用延迟加载,因此我想在需要时创建一些简单的显式后期加载,最好使用泛型方法。这就是我目前的做法,要求所有者作为参数:
public static EntityCollection<T> ReloadIfNeeded<T>(this EntityCollection<T> collection, EntityObject owner) where T : EntityObject {
if (owner.EntityState != EntityState.Detached && !collection.IsLoaded) {
collection.Load();
}
return collection;
}
示例电话:
var orders = customer.Orders.ReloadIfNeeded(customer); //I would like to get rid of the customer parameter here...
我使用的是.NET 4.0版。
编辑:我的解决方案,实施Ognyan Dimitrov的答案:
public static EntityCollection<T> ReloadIfNeeded<T>(this EntityCollection<T> collection) where T : EntityObject {
try {
if (!collection.IsLoaded) {
collection.Load();
}
} catch (InvalidOperationException) {
//just leave unloaded
}
return collection;
}
这并不考虑最初所追求的实体状态,而是以try / catch子句为代价来消除不需要的参数。
答案 0 :(得分:2)
将EntityCollection与Reflector结合起来并查看代码,我看到这个类有一个公共方法
public override void Load(MergeOption mergeOption)
{
base.CheckOwnerNull();
this.Load(null, mergeOption);
}
然后调用另一个内部Load方法:
internal void Load(List<IEntityWrapper> collection, MergeOption mergeOption)
{
bool flag;
ObjectQuery<TEntity> query = base.ValidateLoad<TEntity>(mergeOption, "EntityCollection", out flag);
base._suppressEvents = true;
try
{
if (collection == null)
{
base.Merge<TEntity>(flag ? RelatedEnd.GetResults<TEntity>(query) : Enumerable.Empty<TEntity>(), mergeOption, true);
}
else
{
base.Merge<TEntity>(collection, mergeOption, true);
}
}
finally
{
base._suppressEvents = false;
}
this.OnAssociationChanged(CollectionChangeAction.Refresh, null);
}
它看起来像是在内部检查所有者是否存在,这将使您免于后续Load()&#39;如果你发现异常如果在指定的任何时刻使用MergeOption调用Load(MergeOption)。
&& 39; Detached&#39;在你的情况下意味着实体刚刚来自POST请求的前端?如果您以前有父实体的访问权限,则可以使用以下命令检查其状态:
_context.Entry(entity).State
我不知道分离父实体是否会反映出设置状态&#39;这些孩子来到同一个州。