Vraag EF Code First 4.1 ondersteunt helemaal geen nvarchar (max)?


Ik heb behoorlijk veel tijd aan dit probleem besteed en begrijp nog steeds niet waarom het EF-team het leven zo hard maakt met Code First.

Dus hier is een voorbeeld:

Mijn POCO:

Hoe ik wil dat het ding eruit ziet:

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)");   
}

Het enige dat werkt:

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

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

Het probleem is dat wanneer ik in het eerste geval iets probeer in te voegen dat het me geeft: Validation failed for one or more entities en de tweede zaak past niet in mijn bedrijfsmodel.

Ben ik de enige met dit probleem? Hoe ga ik met dit ding om?


21
2018-03-17 22:39


oorsprong


antwoorden:


Gebruik makend van Int32.MaxValue kan tot problemen leiden wanneer verbonden met een SQL Server-database. Gebruik makend van Int32.MaxValue in het attribuut of in de api wordt een uitzondering gegenereerd met de melding "String-kolom met MaxLength groter dan 4000 wordt niet ondersteund". Maar met een van de volgende methoden werkt het prima voor mij in EF 4.1:

U kunt de MaxLengthArritbuteb.v.

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

Of de vloeiende API, zoals zo

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

Om het gebruik van af te dwingen ntext gebruik een van de volgende:

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

Of de vloeiende API, zoals zo

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

Mogelijk hebt u de MaxLength attribuut in dit geval.

UPDATE (2017-september-6):

Zoals Sebazzz opmerkte in zijn commentaar ntext (en text) is verouderd in SQL Server 2016. Hier is een link naar verdere informatie:

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


38
2018-03-20 22:21



Gebruik dit:

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

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

Of dit:

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

4
2018-03-17 23:01



Het gebruik van het [MaxLength] -attribuut zonder enige waarde, zoals beschreven in de post van André Artus, werkt perfect. Onder SQL CE gebruikt het correct "ntext", terwijl het onder SQL Server "nvarchar (max)" gebruikt. Dit is zeer gewenst, maar moet duidelijker worden gemaakt in de documentatie.


4
2018-03-21 23:28



Ik heb de onderstaande code gebruikt om nvarchar (max) voor een veld in de database te krijgen. Ik gebruik 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


0
2018-02-19 00:58



Ik heb mijn probleem opgelost met iets als dit:

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

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

0
2017-07-03 17:52