EF Code First 4.1根本不支持nvarchar(max)?

时间:2011-03-17 22:39:38

标签: entity-framework orm ef-code-first entity-framework-4.1

5 个答案:

答案 0 :(得分:38)

连接到SQL Server数据库时,使用Int32.MaxValue可能会导致一些问题。在属性或api中使用Int32.MaxValue会抛出异常,指出“不支持MaxLength大于4000的字符串列”。但是,在EF 4.1中使用以下任一方法都可以正常工作:

您可以使用MaxLengthArritbute,例如

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

或者流畅的API,如此

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
      modelBuilder.Entity<Post>()
        .Property(s => s.Text)
        .IsMaxLength();
 }

要强制使用ntext,请使用以下其中一项:

[MaxLength]
[Column(TypeName = "ntext")]
public string Text { get; set; }

或者流畅的API,如此

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
      modelBuilder.Entity<Post>()
        .Property(s => s.Text)
        .HasColumnType("ntext") 
        .IsMaxLength();
 }

在这种情况下,您可能不需要MaxLength属性。

更新(2017年9月6日):

正如Sebazzz在他的评论中所指出的ntext(和text)在SQL Server 2016中已被弃用。以下是更多信息的链接:

https://docs.microsoft.com/en-us/sql/database-engine/deprecated-database-engine-features-in-sql-server-2016

答案 1 :(得分:4)

使用此:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Post>()
        .Property(p => p.Text)
        .HasMaxLength(Int32.MaxValue);
}

或者这个:

[StringLength(Int32.MaxValue)]
public string Text { get; set; }

答案 2 :(得分:4)

使用没有任何值的[MaxLength]属性,如Andre Artus的帖子所述,效果非常好。在SQL CE下它正确使用“ntext”,而在SQL Server下它使用“nvarchar(max)”。这是非常需要的,但应该在文档中更清楚。

答案 3 :(得分:0)

我使用下面的代码获取数据库中字段的nvarchar(max)。我正在使用EF5。

using System.Data.Entity.ModelConfiguration;
using Lansw.Panels.Domain.Entities;

    namespace Lansw.Panels.DataAccess.Configurations
    {
        internal class ServiceAgreementConfiguration : EntityTypeConfiguration<ServiceAgreement>
        {
            public ServiceAgreementConfiguration()
            {
                Property(t => t.ServiceAgreementText).IsRequired().IsMaxLength();
            }
        }
    }

enter image description here

答案 4 :(得分:0)

我用这样的东西解决了我的问题:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Post>()
        .Property(p => p.Text)
        .IsMaxLength()
        .HasColumnType("nvarchar(max)");
}