Pregunta

Me gusta el patrón que vi en esta publicación de blog (http://marekblotny.blogspot.com/2009/04/conventions-after-rewrite.html), donde el autor verifica si ya se ha realizado una modificación en el nombre de la tabla antes de aplicar una convención.

public bool Accept(IClassMap target)
{
    //apply this convention if table wasn't specified with WithTable(..) method
    return string.IsNullOrEmpty(target.TableName);
}

La interfaz de convención que estoy usando para una longitud de cadena es IProperty:

public class DefaultStringLengthConvention: IPropertyConvention
{
    public bool Accept(IProperty property) {
        //apply if the string length hasn't been already been specified
        return ??; <------ ??
    }

    public void Apply(IProperty property) {
        property.WithLengthOf(50);
    }
}

No veo dónde IProperty expone nada que me diga si la propiedad ya se ha configurado.es posible?

TIA Bayas

¿Fue útil?

Solución 3

Para aclarar en código lo que Stuart y Jamie están diciendo, esto es lo que funciona:

public class UserMap : IAutoMappingOverride<User>
{
    public void Override(AutoMap<User> mapping) {
        ...
        const int emailStringLength = 30;
        mapping.Map(x => x.Email)
            .WithLengthOf(emailStringLength)                        // actually set it
            .SetAttribute("length", emailStringLength.ToString());  // flag it is set
        ...

    }
}

public class DefaultStringLengthConvention: IPropertyConvention
{
    public bool Accept(IProperty property) {
        return true;
    }

    public void Apply(IProperty property) {
        // only for strings
        if (!property.PropertyType.Equals(typeof(string))) return;

        // only if not already set
        if (property.HasAttribute("length")) return;

        property.WithLengthOf(50);
    }
}

Otros consejos

.WithLengthOf() agrega una "alteración" (Action<XmlElement>) a la lista de modificaciones que se aplicarán cuando se genere la asignación XML.Desafortunadamente, ese campo es private y no hay ninguna propiedad para acceder a la lista de modificaciones, por lo que me temo que (actualmente) no hay forma de verificar si un mapa de propiedad ha tenido WithLengthOf aplicado a ello.

Hasta que aparezca una alternativa mejor, puede usar HasAttribute("length").

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top