我正在使用Entity Framework中的update-database
命令更新我的数据库,并且它引发了错误消息:String or binary data would be truncated. The statement has been terminated
如何让更新生效?
答案 0 :(得分:13)
将此代码作为第一个实体:
public class Something
{
public string SomeProperty { get; set; }
}
这将创建一个NVARCHAR(MAX)
类型的列,它可以让您存储任何大小的文本。
现在我们应用这样的注释:
public class Something
{
[MaxLength(50)]
public string SomeProperty { get; set; }
}
所以现在从此迁移缩短您的列只有50个字符。如果您的条目长度超过50个字符,您将收到该错误消息。
解决方案1
修复数据!删除超过50个字符的所有数据。使用SQL,删除有问题的行:
DELETE FROM MyTable
WHERE LEN(MyColumn) > 50
或者,可能更好的想法是手动截断数据:
UPDATE MyTable
SET MyColumn = LEFT(MyColumn, 50)
WHERE LEN(MyColumn) > 50
解决方案2 (不是100%确定这会起作用)
让迁移使用以下命令截断数据:
Update-Database -Force
答案 1 :(得分:1)
以下是有关如何调试此问题或与EF相关的任何问题的文章:
String or binary data would be truncated. The statement has been terminated
基本上你要做的就是打开“SQL Server Profiler”并启用“Exception”和“RPC:Starting”分析器。当您在Profiler中收到错误时,您将能够看到EF执行的完整查询。从那里,您可以复制并粘贴到MS SQL Server Management Studio手动运行它并确定问题。
答案 2 :(得分:0)
对我而言,听起来你试图将表格中某个字段的长度/大小改为“小”,然后再将其中的一些数据改为其中。
所以例如,如果我的表中有一个varchar(28)类型的字段字段 - 里面的数据已经是28个字符...然后我尝试执行一个alter table来减小varchar的大小(25)它会说:字符串或二进制数据将被截断
如果你试图填充一个字符串,可以说30个cahraters长到一个只支持28个字符的字段,那么它也会出现......
因此,如果您尝试将数据插入字段并且数据大到适合以符合条件,则会发生这种情况
答案 3 :(得分:0)
在EF点网核心“代码优先”中,可以执行以下SQL语句:
UPDATE MyTable
SET MyColumn = LEFT(MyColumn, 50)
WHERE LEN(MyColumn) > 50
在“向上迁移”部分中,可以这样执行sql:
modelBuilder.sql("UPDATE MyTable SET MyColumn = LEFT(MyColumn, 50) WHERE LEN(MyColumn) > 50");
请注意,该语句必须在更改字符串长度之前。
答案 4 :(得分:0)
这是一个属性长度问题。您正在尝试插入长度小于声明的属性长度的属性值。