ObjectContext上的ObjectSet列表和ObjectSet上的EntityCollections

时间:2011-12-19 17:40:20

标签: c# .net entity-framework entity-framework-4

我正在使用EntityFramework和IRepository Pattern,我需要向所有EntityCollections添加一些事件。

有没有办法在ObjectContext上获取集合列表?
我还需要一种方法来获取ObjectSet / EntityCollection上的所有集合。这可能吗?

我的最终目标是迭代所有集合和子集合,并将AssociationChanged事件添加到我的所有子集合中。删除关系时,它将在对象上调用delete。

这可以弥补EF does not support connectionless deletes(至少不支持无连接更新和插入)这一事实。

2 个答案:

答案 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先生让我来到这里。