2011-10-18 53 views
3

我試圖使用實體框架將網站的內容保存到我的數據庫。但是,當HTML> 4000的長度,我得到這些驗證錯誤:使用實體框架在SQL數據庫中保存長字符串

A first chance exception of type 'System.Data.Entity.Validation.DbEntityValidationException' occurred in EntityFramework.DLL WebDev.WebServer40.exe Information: 0 : Property: RawData Error: The field RawData must be a string or array type with a maximum length of '4000'.

任何想法如何解決這個問題? RawData被創建爲NVARCHAR(4000),但更好的類型是TEXT。我能以某種方式強制嗎?

謝謝!

+0

RawData屬性是什麼類型的數據類型?這不是一個字符串? – Icarus

+0

您使用SQL CE嗎? –

+0

RawData只是C#中的一個字符串。我正在使用SQL CE(僅僅通過我的連接字符串來判斷)。 –

回答

2

TEXT數據類型,取而代之的NVARCHAR(MAX)被棄用,我會用它來拯救你自己,重構道路。

http://technet.microsoft.com/en-us/library/bb510662.aspx

SQL CE不支持NVARCHAR(MAX)所以它限制了你的字符串NVARCHAR(4000)

如果可以使用SQL Server 2008中,實體框架會產生從你的字符串爲您NVARCHAR(MAX)列。

+0

那我該如何提升MAX的價值? –

+0

要澄清此答案 - 移到SQL Server 2008.不要使用CE。 –

+0

您確定SQLCE(4)中的限制爲4000嗎?如果你使用[MaxLegth]註釋....我認爲它是有效的....我自己使用它,它可以工作... –

1

TEXT類型將是一個更好的選擇。然而,與有限的nvarchar相比,這是內存飢餓。

或者,您可以使用BLOB,但會要求您執行一些字符串數據處理。

+0

在這張表中不會有很多行,所以我應該使用TEXT? BLOB更高效的內存? –

+0

當您將值作爲字符串放置時,TEXT更易於處理。如果您使用BLOB,則必須在保存時將其轉換爲二進制,然後在讀取時將其轉換爲字符串。 – Jonats

0

您是否使用EF Code First?您可以在實體映射文件中指定文本類型。

實例映射文件:

public class CustomerMap : EntityTypeConfiguration<Customer> 
{ 
    this.Property(t => t.Description).HasColumnType("text"); 
} 

然後,你必須註冊你的映射文件在您的DbContext類的OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new CustomerMap()); 
    base.OnModelCreating(modelBuilder); 
} 
+0

映射文件在哪裏?我試圖弄清楚這是什麼「屬性」。 –

6

我正在使用SQL CE 4.0,並有非常相同的問題。我設法解決它使用以下DataAnnotation(我喜歡註釋:))

public class Page 
    { 
     [Key] 
     public int PageId { get; set; } 

     [MaxLength] 
     public string Content { get; set; } 
    } 

現在我可以保存內容屬性中的任何內容!

相關問題