ObjectContext上的ObjectSet列表和ObjectSet上的EntityCollections列表
本文关键字:列表 ObjectSet 上的 EntityCollections ObjectContext | 更新日期: 2023-09-27 18:18:13
我正在使用EntityFramework和IRepository模式,我需要向所有EntityCollections添加一些事件。
是否有一种方法可以在ObjectContext上获得集合列表?
我还需要一种方法来获得ObjectSet/EntityCollection上的所有集合。这可能吗?
我的最终目标是迭代所有集合和子集合,并向所有子集合添加AssociationChanged事件。当关系被删除时,它将在对象上调用delete。
这是为了弥补EF不支持无连接的删除(至少不像它支持无连接的更新和插入)的事实。
您可以使用以下未经测试的代码获得ObjectSets:
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是泛型的,当你不知道用什么类型来定义它们时,处理泛型类型的变量可能不那么明显。
对于获取对象集上的实体集合,可以采用类似的方法,但目前手头没有这样做的示例。
要扩展上述关于ObjectSet方法的答案,在我的例子中,要在泛型propertyinfo类型中建立基础类型,您需要执行以下操作:
propertyInfo.PropertyType.GetGenericArguments();
,它将为您提供在运行时应用于该特定泛型类型的参数类型。我相信对于EntityFramework,这些objectset只支持单个参数,因此要找出底层对象类型只需输入:
propertyInfo.PropertyType.GetGenericArguments().First();
感谢上面的巴布科克先生,是他让我来到这里的。