2015-09-19 9 views
9

Sto costruendo un primo codice EF6 utilizzando l'API fluente. La mia comprensione è, per impostazione predefinita, le stringhe saranno nvarchar (max), che (per essere smussato) è stupido per un default. Così ho aggiunto il seguente codice convenzione per impostare lunghezza massima predefinita di 255 caratteri:Imposta il codice EF6 Prime stringhe su nvarchar (max)

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

Poi ho creato un decoratore in questo modo:

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

voglio applicare questo a specifiche proprietà di stringa che ho effettivamente vuole essere NVARCHAR (MAX).

Cosa inserisco nell'API fluente per assicurarmi che tutte le proprietà delle stringhe con il decoratore [Testo] siano costruite nel db con NVARCHAR (MAX)? Presumo che sarebbe qualcosa di simile:

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

O sto facendo questo completamente sbagliato?

risposta

14

Non so se hai già trovato una risposta, ma nel caso in cui qualcun altro si stia chiedendo come farlo, imposta semplicemente il tipo di dati SQL e ignora l'invocazione HasMaxLength().

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

Uso IsMaxLength() o HasMaxLength (Null) sarebbe impostare il campo nvarchar (4000) (varchar (8000) se specificando il tipo di dati varchar).

7

Se si sta facendo all'interno di una classe di EntityTypeConfiguration<MyEntity>, è simile a quella di @ RickNo risposta, ma è fatto in questo modo:

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