如何在代码中首先指定长度超过8000字节的EF byte []?

时间:2017-01-14 12:06:09

标签: entity-framework code-first varbinarymax

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

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

  

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

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

enter image description here

这个限制对我来说似乎太严重了。试图找出它被强加的原因并没有给出一个很好的理由。所以,我的问题是

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

为什么无法首先在EF代码中将byte []属性映射到varbinary(max)?

欢迎任何评论(或当然的答案)。提前谢谢。

编辑(根据Gert的评论):离开没有任何规格的属性会使EF生成varbinary(max)。出乎意料的简单!

答案 1 :(得分:1)

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

[Column(TypeName =“ image”)]
byte []照片{get;组; }

我找到了正确的方法,而是添加了此属性

[MaxLength]
公共字节[]照片{get;组; }

使用Column(TypeName)建议,我最终将在SQLCE中遇到以下错误:

“照片”字段必须是字符串或数组类型,最大长度为“ 4000”

答案 2 :(得分:0)

在要更新数据库之前,请先查看使用 文件名后生成的 文件名 。 > ” 如果您看到方法“ CreateTable”,并且看到应该为长度为MAX的二进制类型的字段,则可以将其生成为c.Binary(maxLength:8000),完全删除参数maxLength,然后使用update -database,然后您可以在SQL Server数据库中检查创建的表!