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?
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).
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)");
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());