entity-framework orm ef-code-first entity-framework-4.1

entity framework - ¿El código de EF First 4.1 no admite nvarchar(max) en absoluto?



entity-framework orm (5)

El uso de Int32.MaxValue puede ocasionar algunos problemas cuando se conecta a una base de datos de SQL Server. El uso de Int32.MaxValue en el atributo o en la API produce una excepción que indica que "la columna de cadena con MaxLength mayor que 4000 no es compatible". Pero, usar cualquiera de los siguientes métodos funciona bien para mí en EF 4.1:

Puede utilizar MaxLengthArritbute , por ejemplo,

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

O la API fluida, como tal

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

Para imponer el uso de ntext use uno de los siguientes:

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

O la API fluida, como tal

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

Es posible que no necesite el atributo MaxLength en este caso.

ACTUALIZACIÓN (2017-Sep-6):

Como Sebazzz señaló en su comentario, ntext (y text ) ha quedado en desuso en SQL Server 2016. Aquí hay un enlace a más información:

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

He dedicado una cantidad de tiempo decente a este problema y todavía no puedo entender por qué el equipo de EF hace que la vida sea tan difícil usando Code First.

Así que aquí hay una muestra:

Mi POCO:

La forma en que quiero que se vea la cosa:

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

Lo único que funciona:

public class Post { public int Id {get; set;} [StringLength(4000)] public string Text {get; set;} }

El problema es que cuando en el primer caso trato de insertar algo que me da: la Validation failed for one or more entities y el segundo no se ajusta a mi modelo de negocio.

¿Soy el único con este problema? ¿Cómo trato con esto?


El uso del atributo [MaxLength] sin ningún valor, como se describe en la publicación de Andre Artus, funciona perfectamente. Bajo SQL CE usa correctamente "ntext", mientras que bajo SQL Server usa "nvarchar (max)". Esto es altamente deseado, pero debe quedar más claro en la documentación.


Resolví mi problema con algo como esto:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Post>() .Property(p => p.Text) .IsMaxLength() .HasColumnType("nvarchar(max)"); }


Utilicé el siguiente código para obtener nvarchar (max) para un campo en la base de datos. Estoy usando 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(); } } }


Utilizar esta:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Post>() .Property(p => p.Text) .HasMaxLength(Int32.MaxValue); }

O esto:

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