- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 WebAPI Web 应用程序中,我已将 varbinary(max) 字段添加到表中,并将 byte[] 字段添加到 POCO (BatchCharge) 中。该实体有一个子实体(Charge)。
Visual Studio 2013、 Entity Framework 6、SQL Server 2014。
数据模型如下:
public class BatchCharge
{
public int ID { get; set; }
public byte[] FileData { get; set; }
public virtual ICollection<Charge> Charges { get; set; }
}
public class Charge
{
public int ID { get; set; }
public DateTime CreatedUTC { get; set; }
public decimal Amount { get; set; }
public virtual BatchCharge BatchCharge { get; set; }
}
映射是在 Charge 实体(子实体)上完成的,如下所示:
public class ChargeMap : EntityTypeConfiguration<Charge>
{
public ChargeMap()
{
// Primary Key
HasKey(t => t.ID);
// Table and Column Mappings
ToTable("Charge");
Property(t => t.ID).HasColumnName("ID");
Property(t => t.ID).IsRequired();
Property(t => t.CreatedUTC).HasColumnName("CreatedUTC");
Property(t => t.CreatedUTC).IsRequired();
Property(t => t.Amount).HasColumnName("Amount");
Property(t => t.Amount).IsRequired();
HasRequired(t => t.BatchCharge)
.WithMany(t => t.Charges)
.HasForeignKey(d => d.BatchChargeID);
}
}
使用以下方法检索 BatchCharges 列表时:
[ActionName("GetBatchCharges")]
[HttpGet]
[Route("api/charges/batches")]
[Authorize(Roles = "Administrator")]
public HttpResponseMessage GetBatchCharges(int skip = 0,
int take = 25,
int statusFilter = 0)
{
try
{
var batchCharges = _centralDb.BatchCharges.AsQueryable();
if (statusFilter > 0)
{
batchCharges = batchCharges.Where(bc => bc.StatusID == statusFilter);
}
// Page and list.
var allBatchCharges = batchCharges.OrderByDescending(c => c.CreatedUTC);
var totalCount = allBatchCharges.Count();
var thePage = allBatchCharges.Skip(take * skip).Take(take).ToList();
// Transform and return.
var result = new
{
TotalCount = totalCount,
CurrentPage = skip,
BatchCharges = thePage.Select(c => MapperFactory.Mapper.Map<BatchCharge, BatchChargeDTO>(c)).ToList()
};
return Request.CreateResponse(HttpStatusCode.OK, result);
}
catch (Exception ex)
{
const string message = "Exception getting batch charges.";
Logger.Error(ex, message);
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError(message));
}
}
我收到 OutOfMemoryException。当我中断上面的行并尝试查看查询结果时,我看到错误“由于内存不足异常,函数计算被禁用。”。请参阅下面的屏幕截图。
这告诉我 EF6 内部发生了内存不足异常。
我已经看到了几个有关如何增加进程内存的相关答案。我不相信这就是问题所在。测试数据包括 BatchCharge(父)表中的六行,最大文件大小为 27 KB!
该文件是一个 CSV 文件,其中包含子实体(费用)信息。使用此模型上传和保存带有文件数据的 BatchCharges 没有问题。我还在每个 BatchCharge 的少量费用(子实体)上成功使用了它。
当我小时候上传包含 600 个费用的 BatchCharge 时,问题就开始了。正如我提到的,这不是文件大小问题,因为文件大小为 27KB。
如果这里存在循环引用,那么它应该发生在我拥有的许多其他类似配置的关系中。或者字节数组字段是否与父/子关系一起产生了问题?如果是这样,怎么办?
编辑:当我用 try/catch block 包围代码并在调试器中逐步运行它时,它不会在代码中的任何地方引发异常!但是,到达浏览器的响应包含一个标准 IIS 未处理的异常页面,其中包含如下服务器错误(运行代码片段以查看输出):
body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;}
p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
pre {font-family:"Consolas","Lucida Console",Monospace;font-size:11pt;margin:0;padding:0.5em;line-height:14pt}
.marker {font-weight: bold; color: black;text-decoration: none;}
.version {color: gray;}
.error {margin-bottom: 10px;}
.expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
@media screen and (max-width: 639px) {
pre { width: 440px; overflow: auto; white-space: pre-wrap; word-wrap: break-word; }
}
@media screen and (max-width: 479px) {
pre { width: 280px; }
}
<body bgcolor="white">
<span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1>
<h2> <i>Exception of type 'System.OutOfMemoryException' was thrown.</i> </h2></span>
<font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
<b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
<br><br>
<b> Exception Details: </b>System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.<br><br>
<b>Source Error:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code>
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.</code>
</td>
</tr>
</table>
<br>
<b>Stack Trace:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code><pre>
[OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.]
System.IO.MemoryStream.set_Capacity(Int32 value) +89
System.IO.MemoryStream.EnsureCapacity(Int32 value) +90
System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count) +326
Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.ArteryFilter.Write(Byte[] buffer, Int32 offset, Int32 count) +106
System.Web.HttpWriter.FilterIntegrated(Boolean finalFiltering, IIS7WorkerRequest wr) +475
System.Web.HttpResponse.FilterOutput() +154
System.Web.CallFilterExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +247
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +117
</pre></code>
</td>
</tr>
</table>
<br>
<hr width=100% size=1 color=silver>
<b>Version Information:</b> Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.7.3056.0
</font>
</body>
最佳答案
感谢@IvanStoev,发现了 DTO 中的问题:它们引用了 EF 属性(下面突出显示),这会导致较大数据集出现内存不足异常。
public class BatchChargeDTO
{
public int ID { get; set; }
public byte[] FileData { get; set; }
// Problem is here: type should be ChargeDTO!!
public ICollection<Charge> Charges { get; set; }
}
public class ChargeDTO
{
public int ID { get; set; }
public DateTime CreatedUTC { get; set; }
public decimal Amount { get; set; }
public int? BatchChargeID { get; set; }
// Problem is here: type should be BatchChargeDTO!!
public BatchCharge BatchCharge { get; set; }
}
关于entity-framework - EF6 OutOfMemoryException 使用 varbinary(max) 属性评估实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51084483/
我创建了一个表来插入我的应用程序的所有文档。这是一个简单的表(我们称之为 DOC_DATA),它有 3 个字段:DOC_ID、FileSize、Data。数据是 varbinary(max)。 然后我
我有一个数据库,该数据库被设置为对 varbinary(max) 字段上的音频文件使用 blob FileStream。它的大小已经增长到 80GB 以上,我面临着性能问题。 环顾四周后,我发现我的平
在 SQL Server 2008 中从 varbinary(MAX) 字段(不使用 FileStreams)读取部分二进制数据的最有效方法是什么? 将数据写入列时,T-SQL 中可以使用 VarBi
我正在尝试将存储在 CONTEXT_INFO 中的 nvarchar 转换回。 declare @LanguageCode nvarchar(6) = 'en'; declare @binvar va
我正在尝试转换回存储在 CONTEXT_INFO 中的 nvarchar。 declare @LanguageCode nvarchar(6) = 'en'; declare @binvar varb
我有一张像: create table tbl ( id int, data image ) 发现栏目data尺寸非常小,可以存储在varbinary(200) 所以新表将是, create
我在 SQL 中有一个 varbinary 列,我希望该列始终是唯一的。但是,我看到 SQL 不允许在 varbinary 列上创建唯一约束。 是否有任何解决方法来确保这种唯一性?也许通过使用其他类型
有人请解释为什么选择 len(0x0a000b) 返回 3? len 计算字节数吗?为什么 select left(0x0a000b, 1) 什么都不返回?我期望 0x0a(如果 len 计算字节).
我将图像存储在数据库中的 varbinary(max) 字段中。 我正在尝试在我的表单上显示图片。我尝试了很多不同的方法,但没有显示出来。 这是我的代码: //I am adding an image
我们面临一个非常奇怪的问题。 当表列如下时,我们的 mssql 2008 R2 数据库中有一张表: 用户 ID - int 用户名 - varbinary(256) 用户类型 - int 并且 use
我正在尝试将 MSSQL 数据库移植到 MariaDB,并且遇到了使用 varbinary(max) 创建表的情况: `definition` VARBINARY(max) NULL DEFA
如何在 varbinary 中获取特定范围的字节数据? 例如长度 varbinary数据是 128,我只想得到 15-19 个字节。 最佳答案 SELECT SUBSTRING(VarbinaryCo
我正在使用以下命令将 .jpg 插入到 SQL Server 2012 中的 varbinary(max) 列中: INSERT INTO Employees VALUES(5, (SELECT *
基本上,我试图给用户一个特定的密码,以便我可以在系统上测试某些功能,因为我只有我们的管理员帐户,我不能玩,我只是选择一个随机帐户,以便我可以进行测试。所以这是我的更新尝试: UPDATE dbo.Lo
使用 SQL 2005 我有一个包含 5 列的表格 ID - int Param - smallint Data1 - image Data2 - image Data3 - image 图像大小可以
我想升级表中的所有列,我的目标是从要更新的行中检索一列然后更新它,例如: update works set encrpyted_item_no = (CAST(RTrim(( select u
我有一些 varbinary 数据存储在 MS Sql Server 2005 的表中。是否有人有将查询作为输入的 SQL 代码(假设查询保证返回单列 varbinary)并将字节输出到磁盘(每行一个
这个问题已经有答案了: Convert integer to hex and hex to integer (16 个回答) 已关闭10 年前。 这几乎是一个菜鸟问题,但我找不到解决方案。 我正在使用
我们使用 varchar(255) 在 mysql 中存储“关键字”。我们面临一个问题,即 mysql 会忽略“=”中用于比较目的的所有尾随空格。它确实尊重“like”比较中的尾随空格,但它不允许我们
我设法将 Image 转换为 varbinary 并将其存储在我的数据库中。我一直在尝试将 varbinary 转换为图像,但我在这里遇到了一些麻烦。 首先,我从服务中的数据库中获取二进制文件。
我是一名优秀的程序员,十分优秀!