使用ASP.NET MVC 3和Entity Framework 4.1 Code First在SQL CE 4.0中存储映像时出错

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时会产生相同的结果.

  • 正是我需要的东西,[MaxLength]应用于字符串在SQL Server CE中创建ntext(长度不限)列 (2认同)