EF Code First 4.1 вообще не поддерживает nvarchar (max)? - PullRequest
21 голосов
/ 18 марта 2011

Я потратил приличное количество времени на эту проблему и до сих пор не могу понять, почему команда 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, а второй случай не соответствует моей бизнес-модели.

Я один с этой проблемой?Как мне справиться с этой вещью?

Ответы [ 5 ]

38 голосов
/ 21 марта 2011

Использование Int32.MaxValue может привести к некоторым проблемам при подключении к базе данных SQL Server. Использование Int32.MaxValue в атрибуте или в API вызывает исключение о том, что «String column with 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-Sep-6):

Как отметил Себаззз в своем комментарии, ntexttext) устарел в SQL Server 2016. Вот ссылка на дополнительную информацию:

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

4 голосов
/ 22 марта 2011

Использование атрибута [MaxLength] без какого-либо значения, как описано в посте Андре Артуса, работает отлично. В SQL CE он правильно использует «ntext», а в SQL Server - «nvarchar (max)». Это очень желательно, но должно быть уточнено в документации.

4 голосов
/ 18 марта 2011

Используйте это:

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; }
0 голосов
/ 03 июля 2015

Я решил свою проблему примерно так:

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

    modelBuilder.Entity<Post>()
        .Property(p => p.Text)
        .IsMaxLength()
        .HasColumnType("nvarchar(max)");
}
0 голосов
/ 19 февраля 2014

Я использовал код ниже, чтобы получить 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

...