【发布时间】:2016-01-11 18:17:48
【问题描述】:
我有一个令人困惑的问题。我有一个使用本地 SQL Server 数据库的 WPF 应用程序。我正在使用实体框架。我正在尝试将长度为 120 的字节数组存储到 BINARY(120) 列中。
数据应该适合,但由于某种原因,我不断收到错误消息,“字符串或二进制数据将被截断”。
表结构如下:
Column_name Type Computed Length
Id int no 4
Foo varchar no 500
Bar binary no 120
作为一项实验,我尝试将列更改为 VARBINARY(MAX) 列,但即使在这种情况下,我仍然会遇到相同的错误。这通常表明另一列可能导致问题,但是我知道问题不是 Id 列,我存储到 Foo 中的字符串是“测试字符串”,这显然足够小。
插入数据库的方法没有做任何特别的事情:
public void Create(FooEntry entry)
{
_context.FooEntries.Add(entry);
_context.SaveChanges();
}
也许我遗漏了一些非常明显的东西,但我应该如何解决这个问题?
更新:
是的,我很确定 EDMX 和数据库表是同步的(因为当我更新数据库表时,我总是刷新 edmx)。
我尝试手动将长度为 120 的字节数组插入到表中,但没有收到错误。当我手动插入长度为 121 的字节数组时,出现“字符串或二进制数据将被截断”错误,这是正确的行为。
我在调试程序时尝试插入的字节数组是这个值:
'0x2400320061002400310030002400510078004400310072003400390079004C006D0041004A00760049004E005700730069007900490058004F007400740052007600500031006900700078004C0044007000610032004900350038007700310059002E0071003300680033004B0064002F00430074005700'
这是一个长度为 120 的字节数组。
更新 2:
我运行了 SQL Server Profiler,它给了我以下 SQL 查询:
exec sp_executesql N'INSERT [dbo].[FooEntry]([Foo], [Bar])
VALUES (@0, @1)
SELECT [Id]
FROM [dbo].[FooEntry]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()',N'@0 varchar(500),@1 binary(120)',@0='test string',@1=0x24003200610024003100300024004100420047007400560056006A0076004D006F006500770036005000300054004D002F006B007800740075007A00490036004F004400660047004A0062004E0069004E00790041007A0051006A0058004300660072007400360051007A0043004B004400580075006500
很奇怪。此查询在我手动执行时有效,但在程序运行时执行此查询时,EF 会引发错误。
【问题讨论】:
-
这是实体框架吗?
-
是的,我会相应地编辑问题
-
澄清一下,您的 ID 为 2,147,483,647 或更少,您的 Foo 是“测试字符串”,您的 Bar 是长度为 120 的字节数组?
-
您的 EF 是如何配置的,EDMX 还是 Fluent/代码优先?我们可以看到映射配置吗?
-
尝试在 SQL Server 中手动插入数据。它可能会帮助您跟踪问题。
标签: c# sql-server entity-framework