3

当我调试以下代码System.TypeLoadException时,我在执行Delete().

Using db As New ScholarshipEntities

    db.ApplicationHistories.Where(Function(h) h.HistoryTypeId = 0).Delete()
    db.SaveChanges()

End Using

我在 Visual Studio 2013 中使用 EF 6.1。我还安装了 EntityFramework.Extended 库。

我可以毫无问题地查询结果。我认为当Where方法没有结果时可能会出现错误,但事实并非如此。我添加新模型(.edmx)也没有问题,这是一些有这个例外的人遇到的问题。

我刚刚升级到 EF 6.1 并安装了扩展库。这是我第一次使用其中一种扩展方法。我已经卸载并重新安装了 nuget 包,但没有成功。

IntelliTrace 显示Delete()调用中的以下异常(按顺序):

  • 'EntityFramework.Reflection.DynamicProxy' does not contain a definition for 'InternalQuery'
  • Cannot implicitly convert type 'EntityFramework.Reflection.DynamicProxy' to 'System.Data.Entity.Core.Objects.ObjectQuery<Scholarship.ApplicationHistory>'
  • Could not load type 'System.Data.Entity.Core.Mapping.EntityContainerMapping'

我在扩展库的 github 上添加了一个问题。

更新 我重新安装了 EF 和 EF.Extended 库,但没有成功。我可以RemoveRange在它的位置使用。我能够创建一个新项目,安装包,添加映射到同一数据库的模型,并成功使用Delete. 显然,问题出在我目前的解决方案中。

在我的解决方案中,我有一个 ASP.NET 项目和一个常规库项目。在 ASP 项目中,页面背后的代码调用库中的方法RemoveHistory。该库包含用于业务逻辑和数据访问的类。这两个类都实现了接口。实际Delete发生在数据访问类中。我的模型也位于这个库项目中。

我也许可以创建一个全新的项目并将所有内容都带过来,但这需要相当长的时间。即使我这样做了,我也想首先了解为什么它不起作用,这样我就不必重复这个过程。

4

2 回答 2

0

如果要删除某些行,请这样做:

Using db As New ScholarshipEntities

  db.ApplicationHistories.RemoveRange(db.ApplicationHistories.Where(Function(h) h.HistoryTypeId = 0))
  db.SaveChanges()

End Using

如果要删除单个实体,请这样做:

Using db As New ScholarshipEntities

  db.ApplicationHistories.Remove(db.ApplicationHistories.Single(Function(h) h.HistoryTypeId = 0))
  db.SaveChanges()

End Using
于 2014-05-06T21:27:16.510 回答
0

我前段时间“解决了”这个问题。我最终会回去尝试重现问题以确认我的怀疑。

解决方案中安装了多个版本的实体框架。这似乎并没有影响基本的 EF 功能,尽管我确信它以某种微妙的、潜在的错误方式发生了。

每次打开解决方案时,NuGet 都会声明无法完成卸载。通过 NuGet 卸载和恢复不成功,必须手动删除包。完全删除后,我再次安装了这些软件包。这解决了这个问题。

我希望我能给出一个更技术性的答案,尽管基本原因是忘记仔细查看包文件夹和配置。

于 2014-06-05T03:14:57.107 回答