【问题标题】:List of ObjectSets on an ObjectContext and EntityCollections on an ObjectSetObjectContext 上的 ObjectSet 列表和 ObjectSet 上的 EntityCollections
【发布时间】:2011-12-19 17:40:19
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用以下未经测试的代码获取 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 是泛型的,当你不知道使用什么类型来定义它们时,使用泛型类型的变量可能就不那么明显了。

    至于在对象集上获取实体集合,可以采取类似的方法,但我目前没有这样做的示例。

    【讨论】:

    • 这很好,但最终它对我不起作用,因为我无法将对象作为 ObjectSet 引用。 (var 等同于object。)而且由于我在编译时不知道类型(并且 ObjectSet 必须是通用的,因此无法从该对象集中获取 EntityCollections 列表。:(跨度>
    【解决方案2】:

    要扩展上述关于 ObjectSet 方法的答案,在我的情况下,要在通用 propertyinfo 类型中建立基础类型,请执行以下操作:

    propertyInfo.PropertyType.GetGenericArguments();
    

    这将为您提供在运行时应用于此特定泛型类型的参数类型。我相信对于 EntityFramework,这些 ObjectSet 仅支持单个参数,因此要找出底层对象类型只需:

    propertyInfo.PropertyType.GetGenericArguments().First();
    

    感谢上面的 M. Babcock 首先让我来到这里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2014-06-10
      • 1970-01-01
      相关资源
      最近更新 更多