我正在尝试在SQL Compact Edition (CE)数据库中存储/保存图像。
我在我的学生模型中声明该字段为:
[Column(TypeName = "image")]
public byte[] Photo { get; set; }
数据库是使用Photo列的image数据类型创建的,如下所示:
问题是:
当我运行这个应用程序并尝试用3MB的照片(例如)保存一个学生时,我得到一个异常:
validationError.ErrorMessage = "The field Photo must be a string or array type
with a maximum length of '4000'."
SQL Server CE支持这些Data Types。在这个介于SQL Express和SQL Compact Edition ( CE )之间的comparison中,我们看到SQL通过使用图像数据类型支持二进制(BLOB)存储。
图像=可变长度的二进制数据,最大长度为2^30-1 (1,073,741,823)字节。存储是以字节为单位的值的长度。
我认为图像应该能做好这项工作。
我在这里做错了什么?这是一个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发布的post。它具有以下特性:
将非键字符串和二进制列的默认长度从‘128’更改为‘Max’。SQL Compact不支持“”Max“”列,在针对SQL Compact运行时,附加的代码优先约定将设置默认长度4000。“”在最近的一篇博客文章(下面的链接)中包含了关于这一变化的更多细节。
好吧好吧好吧。我能让它工作的唯一方法就是执行here所描述的操作,也就是设置DbContext.Configuration.ValidateOnSaveEnabled = false
。正如这篇文章所暗示的,这是一种变通方法。
发布于 2011-05-06 05:58:03
对于那些遇到这个问题的人,Erik Ejlskov Jensen发布了a working console application,它演示了解决这个错误的方法。正如操作员所指出的,答案的一个关键部分是:
public StudentContext()
{
// Required to prevent bug - http://stackoverflow.com/questions/5737733
this.Configuration.ValidateOnSaveEnabled = false;
}
已经找到了一个更好的解决方案。请勿禁用验证。来自博客文章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.
发布于 2012-07-19 00:55:51
使用MaxLength数据注释不指定最大长度的方法是不提供最大值。例如:
[MaxLength]
public byte[] Photo { get; set; }
然后,SQL Compact提供程序会将该属性映射到"image“,并且EF验证将识别出没有指定最大长度,因此不需要禁用。如果你想明确地映射到"image“列,那么你可以这样做:
[Column(TypeName = "image")]
[MaxLength]
public byte[] Photo { get; set; }
这将在使用SQL Compact时产生相同的结果。
发布于 2015-03-09 06:14:07
我知道这太晚了,但它可以让其他程序员受益。
您可以添加到OnModelCreating(DbModelBuilder modelBuilder)方法中的context类
modelBuilder.Entity<EntityName>().Property(p => p.Photo).IsMaxLength();
https://stackoverflow.com/questions/5737733
复制相似问题