18

我試圖在SQL精簡版(CE)數據庫中存儲/保存圖像。使用ASP.NET MVC 3和Entity Framework 4.1在SQL CE 4.0中存儲圖像時出錯代碼優先

我宣佈領域在我的學生模型爲:

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

該數據庫與Photo列的圖像數據類型創建爲可以在這裏看到:

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支持這些Data Types。在SQL Express和SQL Compact Edition(CE)之間的這個comparison中,我們已經知道SQL CE通過使用圖像數據類型來支持二進制(BLOB)存儲。

圖片 =可變長度二進制數據 與2^30-1 (1,073,741,823)個字節的最大長度。存儲是以字節爲單位的值的長度的 。

圖片應該做我認爲的工作。

我在這裏做錯了什麼?這是一個錯誤?

注:

我也試過的MaxLength數據註釋:

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

,但我得到這個異常:

Binary column with MaxLength greater than 8000 is not supported. 

編輯:

我發現post關於發佈的EF 4.1。它具有如下:

默認長度的變化對非關鍵 字符串和二進制列從「128」 到「最大」。 SQL精簡不支持 「最大」欄目,對 SQL精簡設置額外的Code First 會議時會設置一個默認長度4000 大約有 包括在最近的博客 後的變化更多詳細資料(鏈接低於)。

好吧好吧好吧...我能得到它的工作的唯一辦法是做什麼的描述here,也就是設置DbContext.Configuration.ValidateOnSaveEnabled = false。正如帖子所示,這是一種解決方法。

+0

有多大是你的形象裏? – 2011-04-21 15:00:45

+0

@Alexandre:它是3 MB。 – 2011-04-21 15:08:01

回答

18

對於遇到此問題的人,Erik Ejlskov Jensen發佈了a working console application,它演示了此錯誤的解決方法。由於OP指出,答案的一個關鍵部分是:

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.

+1

感謝您告訴我他的博客文章。當我遇到這個錯誤時,我接觸到了Erik,以便他可以進一步調查。很高興看到專門討論這個問題的博客文章。正如我的問題也提到,解決這個問題的唯一方法是設置'ValidateOnSaveEnabled = false'。 – 2011-05-05 22:08:49

+0

我建議不要禁用驗證。提到設置MaxLength的答案是一個更好的答案。 – 2013-03-18 16:50:00

+1

其實,正確的答案是使用[MaxLength]屬性,我已經相應地更新了我的博客文章 – ErikEJ 2013-03-18 18:14:45

12

來指定使用的MaxLength數據註釋沒有最大長度的方式是提供沒有最大值。例如:

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

的SQL精簡供應商將然後映射屬性設置爲「形象」和EF驗證將認識到,沒有指定的最大長度等等不需要被禁止。如果你想明確地映射到「圖像」列,那麼你可以這樣做:

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

這將在使用SQL Compact時產生相同的結果。

+2

正是我所需要的,同時[MaxLength]應用於字符串創建SQL Server CE中的ntext(長度無限制)列 – 2012-07-23 12:33:59

+0

如果使用[MaxLength],我會得到一個「不支持的默認值」異常。如果我使用[MaxLength(n)] n不能大於8000? – smerlung 2013-10-29 09:57:55

2

我知道這太晚了,但它可以使其他程序員受益。

您可以添加到背景OnModelCreating(DbModelBuilder模型構建器)方法

modelBuilder.Entity<EntityName>().Property(p => p.Photo).IsMaxLength(); 
相關問題