2011-10-18 30 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; } 
    } 

现在我可以保存内容属性中的任何内容!

相关问题