NHibernte Alteraciones/Convenciones con fluidez
-
03-07-2019 - |
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
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")
.