我正在使用EntityFramework和IRepository Pattern,我需要向所有EntityCollections添加一些事件。
有没有办法在ObjectContext上获取集合列表?
我还需要一种方法来获取ObjectSet / EntityCollection上的所有集合。这可能吗?
我的最终目标是迭代所有集合和子集合,并将AssociationChanged事件添加到我的所有子集合中。删除关系时,它将在对象上调用delete。
这可以弥补EF does not support connectionless deletes(至少不支持无连接更新和插入)这一事实。
答案 0 :(得分:3)
您可以使用以下未经测试的代码获取ObjectSet:
var objSetProps = instanceOfObjectContext.GetType().GetProperties().Where(prop => prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(ObjectSet<>));
foreach(PropertyInfo objSetProp in objSetProps)
{
var objSet = objSetProp.GetValue(instanceOfObjectContext, BindingFlags.GetProperty, null, null, null);
}
一旦你拥有了实例,诀窍就是使用ObjectSet,因为ObjectSet是通用的,当你不知道用什么类型来定义它们时,使用泛型类型的变量就不那么明显了。 / p>
至于在对象集上获取实体集合,可以采取类似的方法,但我目前没有这样做的例子。
答案 1 :(得分:2)
要扩展有关ObjectSet方法的上述答案,在我的情况下,要在通用propertyinfo类型中建立基础类型,请执行以下操作:
propertyInfo.PropertyType.GetGenericArguments();
这将为您提供在运行时应用于此特定泛型类型的参数类型。我相信对于EntityFramework,这些ObjectSets只支持单个参数,因此找出底层对象类型只是:
propertyInfo.PropertyType.GetGenericArguments().First();
感谢上面的M. Babcock先生让我来到这里。