Il mio requisito è quello di configare la mappatura della lunghezza della stringa a livello globale, ma anche di utilizzare MaxLengthAttribute per confondere una proprietà in modo speciale. Ecco il mio codice:
public class StringLengthConvention
: IConfigurationConvention<PropertyInfo, StringPropertyConfiguration>
{
public void Apply(
PropertyInfo propertyInfo,
Func<StringPropertyConfiguration> configuration)
{
StringAttribute[] stringAttributes = (StringAttribute[])propertyInfo.GetCustomAttributes(typeof(StringAttribute),true);
if (stringAttributes.Length > 0)
{
configuration().MaxLength = stringAttributes [0].MaxLength;
}
}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add<StringLengthConvention>();
}
public class ContentInfo
{
// ...
[MaxLength(200)]
[String]
public string TitleIntact { get; set; }
// ...
}
Il mio problema è che "MaxLength" non può più funzionare. Devo controllare se la proprietà ha un MaxLengthAttribute prima di applicare la configurazione globale in StringLengthConvention.Apply ()?
Ciò che funzionerebbe in questa situazione è creare una convenzione leggera che specifichi la proprietà MaxLength per le stringhe. In questa situazione la convenzione imposterà la lunghezza massima della proprietà per tutte le stringhe eccetto dove era già configurata da un'annotazione, con l'API fluente o da un'altra convenzione.
Nel tuo metodo OnModelCreate aggiungi il seguente codice per impostare il tuo MaxLength predefinito:
modelBuilder.Properties<string>()
.Configure(c => c.HasMaxLength(DefaultStringLength));
c'è un walkthough di convenzioni qui: http://msdn.microsoft.com/en-us/data/jj819164.aspx assicurati di dare un'occhiata al "Ulteriori esempi" nella parte inferiore della pagina