Len*_*rri 18 image code-first sql-server-ce entity-framework-4.1 asp.net-mvc-3
我正在尝试将图像存储/保存在SQL Compact Edition(CE)数据库中.
我将学生模型中的字段声明为:
[Column(TypeName = "image")]
public byte[] Photo { get; set; }
Run Code Online (Sandbox Code Playgroud)
使用Photo列的图像数据类型创建数据库,如下所示:

问题是:
当我运行应用程序并尝试使用3 MB的照片保存学生时(例如),我得到一个例外:
validationError.ErrorMessage = "The field Photo must be a string or array type
with a maximum length of '4000'."
Run Code Online (Sandbox Code Playgroud)
SQL Server CE支持这些数据类型.在SQL Express和SQL Compact Edition(CE)之间的比较中,我们得知SQL CE通过使用图像数据类型来支持二进制(BLOB)存储.
Image =可变长度二进制数据,最大长度为2 ^ 30-1(1,073,741,823)字节.存储是以字节为单位的值的长度.
图像应该完成我认为的工作.
我在这做错了什么?这是一个错误吗?
注意:
我还尝试了MaxLength数据注释:
[Column(TypeName = "image")]
[MaxLength(int.MaxValue)]
public byte[] Photo { get; set; }
Run Code Online (Sandbox Code Playgroud)
但我得到这个例外:
Binary column with MaxLength greater than 8000 is not supported.
Run Code Online (Sandbox Code Playgroud)
编辑:
我找到了有关EF 4.1发布的帖子.它有以下几点:
将非键字符串和二进制列的默认长度从"128"更改为"Max".SQL Compact不支持"Max"列,当针对SQL Compact运行时,额外的Code First约定将设置默认长度4000.有关更改的更多详细信息包含在最近的博客文章中(链接如下).
那么好......我能让它发挥作用的唯一方法就是做这里描述的,即设置DbContext.Configuration.ValidateOnSaveEnabled = false.正如帖子所暗示的那样,这是一种解决方法.
Cha*_*rns 18
对于遇到此问题的人,Erik Ejlskov Jensen发布了一个工作控制台应用程序,该应用程序演示了此错误的解决方法.正如OP所指出的,答案的关键部分是:
public StudentContext()
{
// Required to prevent bug - http://stackoverflow.com/questions/5737733
this.Configuration.ValidateOnSaveEnabled = false;
}
Run Code Online (Sandbox Code Playgroud)
已找到更好的解决方案.不要禁用验证.[博客文章更新]
UPDATE: @DamienGuard, of LINQ to SQL and EF Code First fame, pointed out that a better and more provider agnostic solution is to use MaxLength rather than TypeName = “ntext”.
UPDATE 2: Using [MaxLength] prevents any validation errors, and disabling validation is not required.
Art*_*ers 12
使用MaxLength数据注释指定无最大长度的方法是不提供最大值.例如:
[MaxLength]
public byte[] Photo { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后,SQL Compact提供程序将属性映射到"image",EF验证将识别出没有指定最大长度,因此不需要禁用.如果您想明确映射到"图像"列,那么您可以这样做:
[Column(TypeName = "image")]
[MaxLength]
public byte[] Photo { get; set; }
Run Code Online (Sandbox Code Playgroud)
使用SQL Compact时会产生相同的结果.