web-dev-qa-db-fra.com

Comment définir une colonne dans SQL Server sur varchar (max) à l'aide des annotations de données ASP.net EF Codefirst?

J'ai cherché sur le Web à essayer de trouver la syntaxe appropriée pour que Code Entity Framework commence par créer ma table avec une colonne: varchar (max).

C'est ce que j'ai. Par défaut, cela crée varchar (128). Comment créer varchar (max)?

J'ai essayé [MaxLength] sans succès.

Toute aide serait appréciée. Merci!

[Column(TypeName = "varchar")]
public string MediaDesc { get; set; }
40
Maddhacker24
[Column(TypeName = "varchar(MAX)")]

Étonnamment, la solution la plus évidente fonctionne.

L'attribut [MaxLength] crée uniquement une colonne varchar avec une longueur maximale autre que MAX mais - dans mon cas (SQL Server Express 2008 R2) - 8000.

68
Slauma

Cela vous donnera nvarchar(max):

[StringLength(int.MaxValue)]

Je ne pense pas qu'il y ait un attribut pour forcer le non-unicode (êtes-vous sûr de vouloir cela?), Donc pour varchar(max) vous avez besoin d'un Tweak dans le DbContext:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Entity>().Property(x => x.MediaDesc).IsUnicode(false);
}
13
Diego Mijelshon

Utilisez l'annotation [MaxLength].

[Column(TypeName = "varchar")]
[MaxLength]
public string MediaDesc { get; set; }
3
bhuvin

Mise à jour pour la réponse @Slauma. 

Utiliser un remplacement pour toutes les chaînes comme celle-ci dans OnModelCreating:

modelBuilder.Properties<string>().Configure(s => 
    s.HasMaxLength(256).HasColumnType("nvarchar"));

puis en modifiant les propriétés avec des attributs comme celui-ci:

[Column(TypeName = "nvarchar(MAX)")]
public string CaseComment { get; set; }

Ou ca:

modelBuilder.Entity<YourClass>()
    .Property(b => b.CaseComment)
    .HasColumnType("nvarchar(MAX)");

Cela peut provoquer l'exception. Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. Même si le type de données de la colonne est correct, Entity Framework pense toujours qu'il s'agit de nvarchar(256) et renvoie l'erreur DbEntityValidationException

Pour résoudre ce problème, utilisez plutôt ce qui suit:

[Column(TypeName = "nvarchar(MAX)")]
[MaxLength]
public string CaseComment { get; set; }

Ou

modelBuilder.Entity<YourClass>()
    .Property(b => b.CaseComment)
    .HasColumnType("nvarchar(MAX)")
    .HasMaxLength(null);
0
Ogglas

[Column(TypeName = "varchar(MAX)")] se traduit par varchar (Max) dans la base de données. Si vous avez un paramètre de convention personnalisé, MaxLength vaut 100, modelBuilder .Properties<string>() .Configure(c => c.IsUnicode(false).HasMaxLength(100)); vous devez inclure l'attribut MaxLength [Column(TypeName = "varchar(MAX)"), MaxLength]. Si vous ne le faites pas, vous obtiendrez varchar (MAX) dans la base de données mais la validation générera plus de 100 caractères.

0
cResults