web-dev-qa-db-fra.com

Définissez parfaitement les chaînes EF6 Code First sur nvarchar (max)

Je construis un premier modèle de code EF6 à l'aide de l'API fluide. Je crois comprendre que, par défaut, les chaînes seront nvarchar (max), ce qui (pour être franc) est stupide pour un défaut. J'ai donc ajouté le code de convention suivant pour définir la longueur maximale par défaut à 255 caractères:

        modelBuilder.Properties<string>()
            .Configure(p => p.HasMaxLength(255));

Ensuite, j'ai créé un décorateur comme celui-ci:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TextAttribute : Attribute
{
}

Je souhaite appliquer cela à des propriétés de chaîne spécifiques que je souhaite réellement être NVARCHAR (MAX).

Que dois-je mettre dans l'API fluide pour m'assurer que toutes les propriétés de chaîne avec le décorateur [Texte] sont construites dans la base de données avec NVARCHAR (MAX)? Je suppose que ce serait quelque chose comme ça:

        modelBuilder.Properties<string>()
            .Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
            .Configure(p => p.HasMaxLength(?????));

Ou est-ce que je fais ça complètement faux?

12
Jeremy Holovacs

Je ne sais pas si vous avez déjà trouvé une réponse, mais au cas où quelqu'un d'autre se demanderait comment faire, définissez simplement le type de données SQL et ignorez l'invocation HasMaxLength ().

        modelBuilder.Properties<string>()
            .Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
            .Configure(p => p.HasColumnType("nvarchar(max)"));

L'utilisation de IsMaxLength () ou HasMaxLength (null) définit le champ sur nvarchar (4000) (varchar (8000) si le type de données est varchar).

17
RickNo

Si vous le faites dans une classe EntityTypeConfiguration<MyEntity>, elle ressemble à la réponse de @ RickNo, mais se fait comme suit:

Property(x => x.MyVarcharMaxProperty)
    .HasColumnType("nvarchar(max)");
8
Charlie Kilian

Il existe une méthode pour indiquer que vous utilisez le maximum autorisé par la base de données.

IsMaxLength ()

    modelBuilder.Properties<string>()
        .Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
        .Configure(p => p.HasColumnType("nvarchar").IsMaxLength());
3
Dionny Prensa

Vous pouvez utiliser HasColumnType

 enter image description here

ou vous pouvez utiliser sans HasColumnType ou HasMaxLength. Il n'est pas nécessaire d'utiliser HasMaxLength

 enter image description here

0
Ergin Çelik