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

Naz*_*gol 21 orm entity-framework ef-code-first entity-framework-4.1

我花了相当多的时间来解决这个问题,但仍然无法弄清楚为什么EF团队使用Code First让生活如此艰难.

以下是一些示例:

我的POCO:

我想要的东西看起来像:

public class Post
{
     public int Id {get; set;}
     public string Text {get; set;}
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Post>()
        .Property(p => p.Text)
        .HasColumnType("nvarchar(max)");   
}
Run Code Online (Sandbox Code Playgroud)

唯一有效的方法:

public class Post
{
     public int Id {get; set;}

     [StringLength(4000)]
     public string Text {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

问题是,在第一种情况下,我尝试插入它给我的任何东西:Validation failed for one or more entities第二种情况不适合我的商业模式.

我是唯一有这个问题的人吗?我该如何处理这件事?

And*_*tus 38

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

你可以使用MaxLengthArritbute,例如

[MaxLength]
public string Text { get; set; }
Run Code Online (Sandbox Code Playgroud)

或者像流畅的API一样

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

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

[MaxLength]
[Column(TypeName = "ntext")]
public string Text { get; set; }
Run Code Online (Sandbox Code Playgroud)

或者像流畅的API一样

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

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