我们正在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循环失败,因为集合在循环中被修改。
欢迎所有建议!
答案 0 :(得分:2)
问题在于动态不适用于扩展方法。运行时只查找动态对象本身定义的方法 您需要将ToList作为静态方法调用:
foreach (dynamic item in Enumerable.ToList(entitySet))
但我真的认为你应该尽可能使用泛型。