22

我在这个问题上花费了相当多的时间,但仍然无法弄清楚为什么 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)");   
}

唯一有效的:

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

     [StringLength(4000)]
     public string Text {get; set;}
}

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

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

4

5 回答 5

39

连接到 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(and text) 在 SQL Server 2016 中已被弃用。这里是更多信息的链接:

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

于 2011-03-20T22:21:15.237 回答
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; }
于 2011-03-17T23:01:29.703 回答
4

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

于 2011-03-21T23:28:46.750 回答
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();
            }
        }
    }

在此处输入图像描述

于 2014-02-19T00:58:08.563 回答
0

我用这样的方法解决了我的问题:

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

    modelBuilder.Entity<Post>()
        .Property(p => p.Text)
        .IsMaxLength()
        .HasColumnType("nvarchar(max)");
}
于 2015-07-03T17:52:54.007 回答