尝试读取或写入受保护的内存 - .NET EF + Web API

时间:2016-12-24 16:36:13

标签: sql .net entity-framework asp.net-web-api

我有一个相对简单的应用程序,它使用EF6通过.NET Web API提取SQL数据。数据库中有三个表:

产品

CREATE TABLE [dbo].[Product]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](255) NOT NULL,
    [FullName] [varchar](max) NOT NULL,
    [Description] [varchar](max) NOT NULL,
    [BranchID] [int] NOT NULL,
    [ProgramID] [int] NOT NULL,
    [TechnologyPlatformID] [int] NOT NULL,
    [StatusID] [int] NOT NULL,
    [FunctionID] [int] NOT NULL,
    [ProgramManagerID] [int] NOT NULL,
    [TypeID] [int] NOT NULL,
    [Vendor] [varchar](max) NOT NULL,
    [VendorPOC] [varchar](max) NOT NULL,
    [URL] [varchar](255) NULL,
    [Code] [varchar](50) NULL,
    [CreatedBy] [int] NOT NULL,
    [CreateDate] [datetime] NOT NULL,
    [ModifiedBy] [int] NOT NULL,
    [ModifiedDate] [datetime] NOT NULL,

    CONSTRAINT [PK_Product] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Product] WITH CHECK 
     ADD CONSTRAINT [FK_Product_Function] 
     FOREIGN KEY([FunctionID]) REFERENCES [dbo].[Function] ([ID])
GO

ALTER TABLE [dbo].[Product] CHECK CONSTRAINT [FK_Product_Function]
GO

ALTER TABLE [dbo].[Product] WITH CHECK 
     ADD CONSTRAINT [FK_Product_Program] 
     FOREIGN KEY([ProgramID]) REFERENCES [dbo].[Program] ([ID])
GO

ALTER TABLE [dbo].[Product] CHECK CONSTRAINT [FK_Product_Program]
GO

程序:

CREATE TABLE [dbo].[Program]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](255) NOT NULL,

    CONSTRAINT [PK_Program] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

SET ANSI_PADDING OFF
GO

功能:

CREATE TABLE [dbo].[Function]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](255) NOT NULL,
    [Description] [varchar](max) NOT NULL,

    CONSTRAINT [PK_Function_1] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

我的EDMX看起来很正常:

enter image description here

以下是我在我的仓库中访问数据的方式:

enter image description here

突然,我在调用GetProducts()时遇到以下错误:

  

未知模块中出现未处理的“System.AccessViolationException”类型异常。

     

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

我似乎无法弄清楚造成这种情况的原因。这是我尝试过的:

  • 确保在VS
  • 中取消选中“抑制JIT优化...”
  • 在我的本地计算机上修复了.NET Framework

两者都没有...但是,如果我删除SQL中的Function表并更新我的EDMX,问题就解决了。为什么这个表会导致问题?

感谢任何输入,谢谢!

1 个答案:

答案 0 :(得分:0)

尝试关闭代理生成功能,看看是否仍然遇到同样的问题。

我最初的猜测是您通过Program直接包含.Include(x => x.Program),但Function导航属性被代理到一个懒惰的属性中。当WebAPI尝试序列化它时,它会抛出错误。