ToList方法不适用于TrackableCollection

时间:2011-07-12 11:38:53

标签: c# entity-framework dynamic entity-framework-4

我们正在EF 4.0上使用可跟踪实体。

为了删除一个包含所有依赖实体的实体,我正在编写一个从EntityManager中的Delete方法调用的通用DeleteDependentEntities。 (我们不或不想依赖CASCADE DELETE来设置我们数据库中的关系。)DeleteDependentEntities将recursevly扫描所有受影响实体集的子项。

为了保持通用性,以便它可以用于整个项目中的所有实体,我使用的是动态类型。

方法如下:

private void DeleteDependentEntities(dynamic entitySet, dynamic context)
{
  if (entitySet != null)
  {
    foreach (dynamic item in entitySet.ToList())
    {
      // 1. Scan object for children and delete children
      ProcessChildren(item, context);

      // 2. Delete this object
      context.DeleteObject(item);
    }
  }
}

它编译正常,但在运行时我收到以下错误:

'SLS.AnimalIntakeMgmt.DataTypes.TrackableCollection'不包含'ToList'的定义

因此类型推断工作正常。 ToList定义的问题很奇怪,因为TrackableCollection基于ObservableCollection,而ObservableCollection又基于Collection。

ToList是必要的,因为foreach循环失败,因为集合在循环中被修改。

欢迎所有建议!

1 个答案:

答案 0 :(得分:2)

问题在于动态不适用于扩展方法。运行时只查找动态对象本身定义的方法 您需要将ToList作为静态方法调用:

foreach (dynamic item in Enumerable.ToList(entitySet))

但我真的认为你应该尽可能使用泛型。