【问题标题】:Attempted to read or write protected memory when using Entity Framework使用实体框架时尝试读取或写入受保护的内存
【发布时间】:2014-05-29 19:07:40
【问题描述】:

StatCentric.Tracker.Worker.dll 中出现“System.AccessViolationException”类型的未处理异常

附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。

我已经阅读了 Stack Overflow 和各种博客上的大量帖子,但似乎无法找到解决方案。

我正在做一些非常基本的事情:

public void Execute(ITrackerRequestModel model)
{
    PageviewRequest p = (PageviewRequest)model;

    using (var db = new StatCentricEntities())
    {
        db.SetTimeout(60);
        db.sp_Log_PageView2(p.SiteId, p.DateTimeUtc, p.vid, p.QueryString, p.p, p.t);
    }
}

但每次我尝试调用 db.sp_Log_PageView2 时都会弹出此错误。这似乎只发生在我的工作角色内部(我使用的是 Windows Azure)。

另外值得注意的是,我使用的是 Windows Azure 模拟器,而且我使用的是 Windows 8.1。

我尝试了以下方法:

  1. 执行 winsocket 重置
  2. 禁用 JIT 调试(本机、脚本、托管)
  3. 在模块加载时禁用 JIT 调试
  4. 关注了一些旧帖子,这些帖子似乎是特定于 .NET 的修补程序 2.0 并已停产。
  5. 进行了内存诊断,确保它不是我的硬件。

我以管理员身份运行 Visual Studio 并连接到托管在 Azure 中的远程 SQL Server 数据库。

感谢任何有关如何解决或进一步诊断此问题的想法。

【问题讨论】:

  • 你是否从不同的线程访问相同的上下文,因为 EF 不是线程安全的
  • 它为每个数据库操作创建一个新的内容实例,因此不共享。

标签: c# entity-framework azure access-violation


【解决方案1】:

这不是真正的修复,但在等待 Microsoft 修复时,您可以使用此解决方法。

我也有同样的问题。我也尝试了一切来解决这个问题。几天后,我放弃并使用了手动“解决方法”。只需几分钟即可复制现有的存储过程调用并将其转换为新的调用。

只需忽略自动生成的函数并手动调用存储过程。您可以将自动生成的类用于返回的数据。复制和修改现有函数,您将轻松获得正确的参数名称和类型。

只需将部分类实现到不同的文件:

public partial class StatCentricEntities
{
    public virtual List<sp_Log_PageView2_Result> my_sp_Log_PageView2(
        Guid? siteId, 
        DateTime time, 
        string param3, 
        string param4 )
    {
        return Database.SqlQuery<sp_Log_PageView2_Result>(
               "sp_Log_PageView2 @siteId @time @param3 @param4",
                new SqlParameter("siteId", siteId),
                new SqlParameter("time", time),
                new SqlParameter("param3", param3),
                new SqlParameter("param4", param4)).ToList();
    }
}

【讨论】:

  • 谢谢,我会在再次调试此代码时试一试。
【解决方案2】:

我在使用具有“日期”类型的输出参数的 SQL Server 存储过程时收到此“尝试读取或写入受保护的内存异常”错误。我尝试了各种方法都没有成功,为了节省时间,我选择了以下解决方案。

1) 去掉日期类型的输出参数

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);
}

我对这种妥协并不满意,但它确实让我继续前进。

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多