在ASP.NET MVC 3和Entity Framework 4.1 Code First中将图像存储在SQL CE 4.0时出错。

10 浏览
0 Comments

在ASP.NET MVC 3和Entity Framework 4.1 Code First中将图像存储在SQL CE 4.0时出错。

我正在尝试将一张图片存储在SQL Compact Edition (CE)数据库中。

在我的学生模型中,我将字段声明为:

[Column(TypeName = "image")]
public byte[] Photo { get; set; }

根据下面的截图,可以看到数据库中的Photo列是以image数据类型创建的:

enter image description here

问题是:

当我运行应用程序并尝试保存一张大小为3 MB的学生照片时,会出现异常:

validationError.ErrorMessage = "The field Photo must be a string or array type
with a maximum length of '4000'."

SQL Server CE支持这些数据类型。在这个比较中,SQL CE通过使用image数据类型支持二进制(BLOB)存储。

Image = 可变长度的二进制数据,最大长度为2^30–1(1,073,741,823)字节。存储的长度为值的字节数。

我认为Image应该可以胜任这个任务。

我在这里做错了什么?这是一个bug吗?

注意:

我还尝试了MaxLength数据注释:

[Column(TypeName = "image")]
[MaxLength(int.MaxValue)]
public byte[] Photo { get; set; } 

但是我遇到了这个异常:

Binary column with MaxLength greater than 8000 is not supported.

编辑:

我找到了关于EF 4.1发布的文章。其中提到:

将非键字符串和二进制列的默认长度从'128'更改为'Max'。当运行在SQL Compact上时,SQL Compact不支持'Max'列,因此额外的Code First约定将设置默认长度为4000。有关此更改的更多细节可以在最近的博客文章中找到(下面的链接)。

真是太好了...我唯一能够使它正常工作的方法是按照这里描述的方式,即设置DbContext.Configuration.ValidateOnSaveEnabled = false。这是一个解决方法,就像文章中建议的那样。

0
0 Comments

在ASP.NET MVC 3和Entity Framework 4.1 Code First中,使用SQL CE 4.0存储图像时会出现错误。下面是问题的出现原因和解决方法。

问题出现的原因是在使用MaxLength数据注释指定无最大长度时,需要不提供最大值。例如:

[MaxLength]
public byte[] Photo { get; set; }

然后SQL Compact提供程序将将属性映射到"image",EF验证将识别到没有指定最大长度,因此不需要禁用验证。如果要明确地映射到"image"列,则可以这样做:

[Column(TypeName = "image")]
[MaxLength]
public byte[] Photo { get; set; }

在使用SQL Compact时,这将产生相同的结果。

有用户指出,如果将[MaxLength]应用于字符串,将在SQL Server CE中创建ntext(无限长度)列。

另一位用户遇到了"Default values not supported"的异常,如果只使用[MaxLength]。如果使用[MaxLength(n)],n的值不能大于8000。

还有一位用户在Microsoft SQL Azure(RTM)- 12中遇到了此问题,解决方法是使用[Column(TypeName = "image"),MaxLength]。

0
0 Comments

问题的原因是在使用ASP.NET MVC 3和Entity Framework 4.1 Code First时,在将图像保存到SQL CE 4.0中时出错。解决方法是禁用验证或使用[MaxLength]属性。

问题的原因是在保存图像到SQL CE 4.0中时出现错误。在解决方案中,有两种方法可供选择。第一种方法是在Entity Framework上下文的构造函数中禁用验证,代码如下:

public StudentContext()
{
    // Required to prevent bug - http://stackoverflow.com/questions/5737733
    this.Configuration.ValidateOnSaveEnabled = false;        
}

第二种方法是使用[MaxLength]属性,代码如下:

[MaxLength]
public byte[] Image { get; set; }

通过使用[MaxLength]属性,可以避免任何验证错误,无需禁用验证。这种方法更好。

在一个类似的情况下,有人尝试使用EF 6和SQLCE 4,并使用了fluent API来设置图像的类型。然而,即使设置了正确的数据类型和长度,保存操作仍然失败。在这种情况下,没有更多的提示可以提供。

解决这个问题的方法是禁用验证或使用[MaxLength]属性。禁用验证可以通过在Entity Framework上下文的构造函数中设置ValidateOnSaveEnabled属性为false来实现。使用[MaxLength]属性可以避免任何验证错误。

0
0 Comments

这段代码是用于解决在ASP.NET MVC 3和Entity Framework 4.1 Code First中使用SQL CE 4.0存储图像时出现的错误的。下面是该问题出现的原因和解决方法。

原因:

在使用SQL CE 4.0存储图像时,可能会出现错误。这是因为默认情况下,Entity Framework会将图像属性的最大长度设置为4000字节,而SQL CE 4.0只支持最大长度为8000字节的图像属性。

解决方法:

为了解决这个问题,可以在context类的OnModelCreating(DbModelBuilder modelBuilder)方法中添加以下代码:

 modelBuilder.Entity<EntityName>().Property(p => p.Photo).IsMaxLength();

这行代码的作用是将实体类中的图像属性的最大长度设置为最大值,以适应SQL CE 4.0的要求。

通过将上述代码添加到context类中的OnModelCreating(DbModelBuilder modelBuilder)方法中,可以解决使用SQL CE 4.0存储图像时出现的错误。这个解决方法可以帮助其他程序员避免类似的问题。

0