【问题标题】:How to Debug and to Fix 'Exception has been thrown by the target of an invocation' for EF 6, Oracle DB, Controller Scaffolding如何调试和修复 EF 6、Oracle DB、控制器脚手架的“调用目标引发异常”
【发布时间】:2016-05-31 13:31:14
【问题描述】:

编辑 2:

当我使用SQL Server不会发生这种情况。只有当我使用Oracle 时才会发生这种情况。有人建议对此进行调试或提供内部异常。然而,由于这个异常发生在脚手架期间,我无法得到内部异常。另外,我不确定我们是否可以调试脚手架过程。如果有人知道怎么做,请告诉我。


错误

运行所选代码生成器时出错:

'调用目标抛出异常'

好的,首先,thesearchresultsforthiserrorerrorseemstoreturnmany@987654returnmany@987654。

因此我了解到这个错误并不是在 EF 6 中创建 Controller scaffolding 所独有的。

但我的情况是,当我即将在 VS2013 中使用 EF 6 创建Controller Scaffolding 时,我创建了MVC web application

我使用的选项是:

MVC 5 Controller with views, using Entity Framework

我使用Oracle DatabaseOracle.ManagedDataAccess namespace。我发现的一些相关帖子如下:

但他们都没有谈论Oracle DB的具体案例

但由于他们一般都在谈论任何DB,我还是尝试了他们的一些解决方案,包括:

  1. 删除所有 sectionsconnectionStringsproviders,使它们中的每一个都只包含单个项目:

     <configSections>
       <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
     </configSections>
    
     <connectionStrings>
       <add name="EmployeeContext" connectionString="metadata=res://*/Models.EmployeeDataModel.csdl|res://*/Models.EmployeeDataModel.ssdl|res://*/Models.EmployeeDataModel.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;DATA SOURCE=VSDB;PASSWORD=mypassword;USER ID=myuser&quot;" providerName="System.Data.EntityClient" />
     </connectionStrings>
    
     <providers>
       <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
     </providers>
    
  2. Context 中的DbSet 更改为IDBSet

     public virtual DbSet<Employee> Employees1 { get; set; }
    
  3. 使用VS2013 with update 5

  4. 升级到Entity Framework 6.1.3

  5. defaultConnectionFactory 更改为:

     <entityFramework>
       <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
         <parameters>
             <parameter value="mssqllocaldb" />
         </parameters>
       </defaultConnectionFactory>
     </entityFramework>
    

     <entityFramework>
       <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
         <parameters>
             <parameter value="v11.0" />
         </parameters>
       </defaultConnectionFactory>
     </entityFramework>
    
  6. OnModelCreating 事件处理程序从:

     protected override void OnModelCreating(DbModelBuilder modelBuilder) {
         throw new UnintentionalCodeFirstException();
     }
    

     protected override void OnModelCreating(DbModelBuilder modelBuilder) {
         base.OnModelCreating(modelBuilder);
         modelBuilder.HasDefaultSchema("myschema");
     }
    

但这些都不起作用。我仍然得到同样的错误。我什至将它们全部一起尝试,但问题仍然存在。

我不知道在这种情况下应该做什么。有什么想法吗?

编辑:

我也很高兴知道是否有人可以告诉我如何“调试”我的案例的脚手架出了什么问题,以便为我的案例找到正确的解决方案。我是网络编程和实体框架的新手,真的不知道导致错误的幕后发生了什么。

编辑 2:

我已尝试按照评论中的Stevechat 中的Squiggle 的建议通过SQL Server 重做脚手架来隔离问题,但我遇到了no 问题全部。因此,问题一定与 Oracle DB 设置或(可能)与我使用的 ODP.Net 工具有关 Oracle.ManagedDataAccess - EF 是否支持。

【问题讨论】:

  • 该错误是否有任何其他消息或内部异常?调用的目标非常广泛(如您所见)。
  • @Steve 问题是,我无法调试内部异常,因为它不是代码,而是由MVC 5 Controller with views, using Entity Framework 创建控制器获得的脚手架。如果有什么方法可以调试脚手架的内部异常,我也想知道..
  • 那么当您使用 Visual Studio 工具创建控制器时,您会得到它吗?嗯...很明显的问题,但是您是否在新解决方案或不同的数据库访问类型中尝试过?
  • @Steve "当你使用 Visual Studio 工具创建控制器时" 是的,正如你所说......如果你知道如何调试这种情况,我想知道如何。我是按照 youtube 视频系列中的讲座进行的:至少在视频中,youtube.com/… 使用 SqlClient 默认数据库时没有问题。至于使用Oracle.ManagedDataAccess,我必须做一些配置才能使其工作,现在我陷入了这个问题 - 不确定我遗漏了什么配置。
  • 也许您可以尝试注释掉数据上下文类中的一些代码,例如dbset 属性并检查错误是否在某个时候消失。

标签: c# asp.net-mvc oracle entity-framework scaffolding


【解决方案1】:

我在尝试使用我的 oracle 数据库搭建脚手架时遇到了这个确切的错误,但在搭建我的 SQL 数据库时没有问题。我发现 machine.config 文件与 web.config 文件的 oracle.manageddataaccess.client 部分中存在版本号差异。所以我注释掉了 machine.config 文件中包含“oracle.manageddataaccess.client”的每个部分,重建了我的应用程序,我能够成功地搭建我的控制器和视图。

【讨论】:

    【解决方案2】:

    大多数错误是由于配置错误造成的,例如:连接字符串、提供程序等。

    在我的情况下,我发现问题是因为在安装 Oracle 客户端时,我单击在 machine.config 上配置它,所以配置是从那里获取的。

    因此,我从 machine.config 中删除了 oracle 配置,之后脚手架按预期工作。

    已安装:

    1. 来自 Nuget 的 EF 6
    2. Oracle.ManagedDataAccess v12.2.1100
    3. Oracle.ManagedDataAccess.EntiyFramework v12.2.1100

    从 machine.config 中删除:

    <!-- <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> -->
    <!-- <oracle.manageddataaccess.client> -->
        <!-- <version number="4.122.1.0"> -->
          <!-- <settings> -->
            <!-- <setting name="tns_admin" value="c:\oracle64\client\laralal\product\12.2.0\client_1\network\admin" /> -->
          <!-- </settings> -->
        <!-- </version> -->
      <!-- </oracle.manageddataaccess.client> -->
    

    【讨论】:

      【解决方案3】:

      我不确定脚手架的真正问题,但我想帮助

      “我也很高兴知道是否有人可以告诉我我该怎么做 “调试”我的情况下脚手架出了什么问题 我的情况的解决方案。 "

      每个 .net Web 项目都有一个入口点Global.asax,可以处理所有未处理的异常。

      确保Web.config 文件中没有customErrorsOff

      只需在 Global.asax 中添加 Application_Error 方法即可:

      void Application_Error(object sender, EventArgs e)
      { ... }
      

      MSDN Link 提供了更好的实现:

      void Application_Error(object sender, EventArgs e)
      {
        // Code that runs when an unhandled error occurs
      
        // Get the exception object.
        Exception exc = Server.GetLastError();
      
        // Handle HTTP errors
        if (exc.GetType() == typeof(HttpException))
        {
          // The Complete Error Handling Example generates
          // some errors using URLs with "NoCatch" in them;
          // ignore these here to simulate what would happen
          // if a global.asax handler were not implemented.
            if (exc.Message.Contains("NoCatch") || exc.Message.Contains("maxUrlLength"))
            return;
      
          //Redirect HTTP errors to HttpError page
          Server.Transfer("HttpErrorPage.aspx");
        }
      
        // For other kinds of errors give the user some information
        // but stay on the default page
        Response.Write("<h2>Global Page Error</h2>\n");
        Response.Write(
            "<p>" + exc.Message + "</p>\n");
        Response.Write("Return to the <a href='Default.aspx'>" +
            "Default Page</a>\n");
      
        // Log the exception and notify system operators
        ExceptionUtility.LogException(exc, "DefaultPage");
        ExceptionUtility.NotifySystemOps(exc);
      
        // Clear the error from the server
        Server.ClearError();
      }
      

      您可以在此处捕获/观察未处理的异常以及此处的所有内部异常。 希望对调试问题有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 2018-11-08
        相关资源
        最近更新 更多