首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用ASP.NET MVC3和Entity Framework4.1代码优先在SQL CE4.0中存储图像时出错

使用ASP.NET MVC3和Entity Framework4.1代码优先在SQL CE4.0中存储图像时出错
EN

Stack Overflow用户
提问于 2011-04-21 07:17:49
回答 3查看 8.3K关注 0票数 18

我正在尝试在SQL Compact Edition (CE)数据库中存储/保存图像。

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

代码语言:javascript
复制
[Column(TypeName = "image")]
public byte[] Photo { get; set; }

数据库是使用Photo列的image数据类型创建的,如下所示:

问题是:

当我运行这个应用程序并尝试用3MB的照片(例如)保存一个学生时,我得到一个异常:

代码语言:javascript
复制
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数据注释:

代码语言:javascript
复制
[Column(TypeName = "image")]
[MaxLength(int.MaxValue)]
public byte[] Photo { get; set; } 

但是我得到了一个例外:

代码语言:javascript
复制
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。正如这篇文章所暗示的,这是一种变通方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-06 05:58:03

对于那些遇到这个问题的人,Erik Ejlskov Jensen发布了a working console application,它演示了解决这个错误的方法。正如操作员所指出的,答案的一个关键部分是:

代码语言:javascript
复制
    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.

票数 18
EN

Stack Overflow用户

发布于 2012-07-19 00:55:51

使用MaxLength数据注释不指定最大长度的方法是不提供最大值。例如:

代码语言:javascript
复制
[MaxLength]
public byte[] Photo { get; set; }

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

代码语言:javascript
复制
[Column(TypeName = "image")]
[MaxLength]
public byte[] Photo { get; set; }

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

票数 12
EN

Stack Overflow用户

发布于 2015-03-09 06:14:07

我知道这太晚了,但它可以让其他程序员受益。

您可以添加到OnModelCreating(DbModelBuilder modelBuilder)方法中的context类

代码语言:javascript
复制
 modelBuilder.Entity<EntityName>().Property(p => p.Photo).IsMaxLength();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5737733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档