2015-09-19 10 views
9

Ich bin ein erstes Modell EF6-Code mit der fließenden API. Mein Verständnis ist, dass Strings standardmäßig nvarchar (max) sind, was für einen Standard dumm ist. So habe ich die folgende Konvention Code max Standardlänge auf 255 Zeichen zu setzen:Set EF6 Code Erste Strings fließend zu Nvarchar (max)

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

Dann habe ich ein Dekorateur wie so:

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

ich diese auf bestimmte Zeichenfolge Eigenschaften anwenden möchten, dass ich tatsächlich möchte NVARCHAR (MAX) sein.

Was stelle ich in die fließende API, um sicherzustellen, dass alle Zeichenfolgeneigenschaften mit dem [Text] -Dekorator in der db mit NVARCHAR (MAX) erstellt werden? Ich nehme an, es wäre so etwas wie:

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

Oder mache ich das völlig falsch?

Antwort

14

Ich weiß nicht, ob Sie jetzt eine Antwort gefunden haben, aber falls jemand anders sich fragt, wie es geht, legen Sie einfach den SQL-Datentyp fest und ignorieren den HasMaxLength() - Aufruf.

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

Verwendung IsMaxLength() oder HasMaxLength (null) würde das Feld auf nvarchar (4000) (VARCHAR (8000), wenn der Datentyp als VARCHAR Angabe).

7

Wenn Sie es nicht in einem EntityTypeConfiguration<MyEntity> Klasse tun, ist es ähnlich wie @ RickNo Antwort, aber wie dies getan:

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