2015-09-08 1 views
2

La plupart de mes colonnes chaîne I disposées autour 50.EF CodeFirst définir la longueur de chaîne par défaut et remplacer avec DataAnnotations?

Plutôt que d'ajouter DataAnnotation [StringLength(50)] à chaque propriété de chaîne, puis-je régler la génération de chaîne par défaut à 50, et ne précisent le DataAnnotation quand j'ai besoin différent de la valeur par défaut ?

Par exemple,

[StringLength(200)] 
public string Thing1 { get; set; } 
public string Thing2 { get; set; } 
public string Thing3 { get; set; } 
[MaxLength] 
public string Thing4 { get; set; } 

Dans cet exemple, Thing2 et Thing3 pourrait être varchar (50) par défaut et Thing1 et Thing2 serait différent puisque je l'ai spécifiquement les mis autrement

De nombreuses entités et colonnes Donc, cela me permettrait non seulement de gagner du temps, mais rendrait mes classes d'entité beaucoup plus propres

Pour clarifier (pour des raisons de duplication de questions): - Cela ne me dérange pas comment la longueur par défaut est définie (FluentAPI ou quoi que ce soit els e) - Je fais attention à la définition de la longueur de priorité. Je souhaite remplacer à l'aide de DataAnnotations

+0

double possible de [Comment puis-je changer la longueur par défaut maximum de propriétés de chaîne dans Entity Framework 6?] (Http://stackoverflow.com/questions/23689417/how-can-i-change-the- default-max-length-de-string-properties-in-entity-framework) – Claies

+0

Cela semble être spécifique à FluentApi. Je veux définir les remplacements avec DataAnnotations. Je vais modifier ma question pour clarifier – mejobloggs

+0

'fluentApi' est la seule option lorsque vous essayez de définir des options globales pour le framework d'entité. utiliser 'fluentApi' pour définir une valeur par défaut ne signifie pas que vous ne pouvez pas utiliser les annotations de données, elles sont conçues pour fonctionner ensemble. – Claies

Répondre

4

Vous pouvez utiliser une première convention de code personnalisé. Essayez d'ajouter ceci à votre classe de contexte:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Properties<string>() 
       .Configure(c => c.HasMaxLength(500)); 
} 

Vérifiez ce lien pour plus d'informations sur Custom Code First Conventions

0

Oui, vous pouvez utiliser un code personnalisé première convention, mais vous aurez aussi besoin d'avoir un moyen de spécifier nvarchar (max) type de données à une propriété de chaîne. Donc, je suis venu avec la solution suivante.

/// <summary> 
/// Set this attribute to string property to have nvarchar(max) type for db table column. 
/// </summary> 
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public sealed class TextAttribute : Attribute 
{ 
} 

/// <summary> 
/// Changes all string properties without System.ComponentModel.DataAnnotations.StringLength or 
/// Text attributes to use string length 16 (i.e nvarchar(16) instead of nvarchar(max) by default). 
/// Use TextAttribute to a property to have nvarchar(max) data type. 
/// </summary> 
public class StringLength16Convention : Convention 
{ 
    public StringLength16Convention() 
    { 
     Properties<string>() 
      .Where(p => !p.GetCustomAttributes(false).OfType<DatabaseGeneratedAttribute>().Any()) 
      .Configure(p => p.HasMaxLength(16)); 

     Properties() 
      .Where(p => p.GetCustomAttributes(false).OfType<TextAttribute>().Any()) 
      .Configure(p => p.IsMaxLength()); 
    } 
} 

public class CoreContext : DbContext, ICoreContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //Change string length default behavior. 
     modelBuilder.Conventions.Add(new StringLength16Convention()); 
    } 
} 


public class LogMessage 
{ 
    [Key] 
    public Guid Id { get; set; } 


    [StringLength(25)] // Explicit data length. Result data type is nvarchar(25) 
    public string Computer { get; set; } 

    //[StringLength(25)] // Implicit data length. Result data type is nvarchar(16) 
    public string AgencyName { get; set; } 

    [Text] // Explicit max data length. Result data type is nvarchar(max) 
    public string Message { get; set; } 
}