3

我正在使用 EF 6.1.3。使用代码首先将byte[]实体中的属性设置为最大值。8000 字节。任何使它更大的尝试,即 MAX,都失败了。

HasMaxLength(null)(是的,参数是 int 吗?)仍然将其设置为 8000, HasMaxLength(int.MaxValue)或者任何其他大于 8000 的值都会使 EF 抛出System.Data.Entity.Core.MetadataException

指定的架构无效。错误:(0,0):错误 0026:MaxLength '2147483647' 无效。'varbinary' 类型的长度必须介于 '1' 和 '8000' 之间。

SQL server 13.0.2151 (mssqllocaldb) 允许 varbinary(max):

在此处输入图像描述

这个限制对我来说似乎太严格了。试图找到一个强加它的原因也不会产生一个很好的理由。所以,我的问题是

如何首先将 byte[] 映射到 EF 代码中的 varbinary(max) ?

PS:该属性也是“必需的”,但我不确定是否可以将可选属性设置为 varbinary(MAX) 。无论如何,我没有测试过这个案例,因为它对我来说没有多大意义。

4

3 回答 3

4

尽管有多篇文章指出解决方案是添加以下属性

[Column(TypeName="image")]
byte[] 照片 { get; 放; }

我发现正确的方法是添加这个属性

[MaxLength]
公共字节 [] 照片 { 获取;放; }

使用 Column(TypeName) 建议,我最终会收到以下 SQLCE 错误:

字段 Photo 必须是字符串或数组类型,最大长度为 '4000'

于 2018-11-19T17:17:13.847 回答
2

好吧,我找到了解决方法。指定HasColumnType("image")可以解决问题,但我仍然认为 EF 也必须允许指定varbinary(max)

此外,并非所有二进制文件都是图像。;)

仍然有一部分问题没有答案,所以我会这样说:

为什么 byte[] 属性不能首先映射到 EF 代码中的 varbinary(max)?

欢迎任何评论(或答案)。提前致谢。

编辑(根据 Gert 的评论):在没有任何规范的情况下离开该属性会使 EF 生成varbinary(max). 出乎意料的简单!

于 2017-01-14T12:12:27.473 回答
-1

在您要更新数据库之前,请查看使用“add-migration filename”后生成文件名如果您看到方法“CreateTable”并看到应该是长度为 MAX 的二进制类型的字段,可以生成为c.Binary(maxLength: 8000),去掉参数maxLength,然后使用update-database,就可以在SQL server数据库中查看创建的表了!

于 2019-09-19T10:17:44.110 回答