当使用SQL 2014在MVC中调用MVC时,VS 2013会爆炸

时间:2014-08-06 02:33:33

标签: c# asp.net-mvc entity-framework entity-framework-4 entity-framework-5

我有一个MVC5项目,分为主XXXX.Site和XXXX.Data dll,EF6连接到MS-SQL 2014数据库。

当我在MVC控制器上并在XXXX.Data dll内运行的呼叫时按F10,一切顺利。如果我进入DLL代码并在实际的EF调用上放置一个断点... Visual Studio简直就是炸弹了。

我尝试了不同的东西,比如在DLL和MVC网站上重新添加EF6.1.1.1,但没有任何作用。我尝试删除然后添加完全EF。我尝试了一个新项目,只是把代码运行一个简单的存储过程,我甚至尝试将Data.dll组合到MVC站点代码中,将所有数据库访问移动到MVC站点(主要是删除了DLL本身)......但是什么都没有用!!

这是我到目前为止注意到的:

1)如果我在我编写的代码上设置一个断点来调用这个存储过程...... Visual Studio只是炸掉了。

    try
    {
        using (MyDB db = new MyDB())
        {
            // IF BREAKPOINT IS ON LINE BELOW, EXECUTION STOPS ABRUPTLY 
            db.MyStoredProc(value1, value2);
        }
    }
    catch (Exception ex)
    {
        string s = ex.Message;
        return false;
    }

没有引发异常,当它发生时,浏览器会闪烁几次。然后在“输出”窗口中显示此消息:
XXXX.Data.dll中出现'System.AccessViolationException'类型的第一次机会异常

2)如果我把断点放在实际自动生成的EF6代码中,程序会正常运行。

public virtual int MyStoredProc(string value1, string value2)
{
    var value1Parameter = value1 != null ?
        new ObjectParameter("Value1", value1) :
        new ObjectParameter("Value1", typeof(string));

    var value2Parameter = value2 != null ?
        new ObjectParameter("Value2", value2) :
        new ObjectParameter("Value2", typeof(string));

    // IF BREAKPOINT IS ON LINE BELOW, EXECUTION RUNS NORMALLY 
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MyStoredProc", value1Parameter, value2Parameter);
}

请注意,我在两个bin文件夹(MVC和DLL)上都有EntityFramework和EntitySQLServer dll。

问题:
这是SQL2014的问题吗?连接到SQL2012时,我没有发生这种情况 是否有设置显示实际发生的异常?
为什么VS轰炸而不是显示实际错误?

1 个答案:

答案 0 :(得分:0)

我得到了这个"尝试读取或写入受保护的内存异常"使用具有类型'日期'的输出参数的SQL Server存储过程时出错。我尝试了各种各样的事情没有成功,并且为了时间的推移,我们选择了以下解决方案。

1)从存储过程中删除date类型的输出参数。

2)通过存储过程中的select语句返回一个字符串。

SELECT CONVERT(char(10), @AsOfDate, 20) AS AsOfDate

3)将从存储过程返回的字符串转换为C#中的DateTime值。

DateTime asOfDate = DateTime.Now;
using (var context = new DA.MyEntities())
{
    var procResult = context.myStoredProcedure(myParameter).FirstOrDefault();
    DateTime.TryParse(procResult, out asOfDate);
}

我对这种妥协并不十分满意,但它确实让我向前迈进。