EF Code First 4.1 вообще не поддерживает nvarchar(max)?

Я потратил приличное количество времени на эту проблему и до сих пор не могу понять, почему команда EF так усложняет жизнь, используя Code First.

Итак, вот пример:

Мой ПОКО:

Как я хочу, чтобы это выглядело так:

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

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


person Naz    schedule 17.03.2011    source источник


Ответы (5)


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

ОБНОВЛЕНИЕ (6 сентября 2017 г.):

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

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

person Andre Artus    schedule 20.03.2011
comment
Обратите внимание, что ntext устарело. Не рекомендуется использовать его для новых разработок. - person Sebazzz; 06.09.2017

Использовать это:

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; }
person Ladislav Mrnka    schedule 17.03.2011
comment
Команда EF должна составить список хаков для Code First :) - person Naz; 18.03.2011
comment
@NazarGargol: Они выпустят один, когда он будет выпущен. Но они назовут это официальной документацией - person Diego Mijelshon; 20.03.2011

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

person Matt Johnson-Pint    schedule 21.03.2011
comment
Если вы хотите принудительно ntext, то легко применить [Column(TypeName = "ntext")] или .HasColumnType("ntext"), как я сделал в своем первом посте. - person Andre Artus; 22.03.2011
comment
К вашему сведению. Это было изменено в финальной версии EF4.1. Он использует nvarchar(max) по умолчанию БЕЗ использования атрибута [MaxLength]. Вот как это должно быть. :) - person Matt Johnson-Pint; 18.04.2011
comment
Приятно знать, что. Похоже придется заново ковыряться в EF 4.1. - person Andre Artus; 19.04.2011
comment
SQL CE 4 + EF 4.1 использует nvarchar (4000), а не ntext - person Jon Davis; 11.07.2011

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

введите здесь описание изображения

person Diganta Kumar    schedule 19.02.2014

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

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

    modelBuilder.Entity<Post>()
        .Property(p => p.Text)
        .IsMaxLength()
        .HasColumnType("nvarchar(max)");
}
person lucas teles    schedule 03.07.2015