Alterazioni / convenzioni NHibernate fluenti
-
03-07-2019 - |
Domanda
Mi piace lo schema che ho visto in questo post del blog ( http: //marekblotny.blogspot.com/2009/04/conventions-after-rewrite.html ), in cui l'autore sta verificando se è già stata apportata una modifica al nome della tabella prima di applicare una convenzione.
public bool Accept(IClassMap target)
{
//apply this convention if table wasn't specified with WithTable(..) method
return string.IsNullOrEmpty(target.TableName);
}
L'interfaccia della convenzione che sto usando per una lunghezza della stringa è 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);
}
}
Non vedo dove IProperty espone nulla che mi dica se la proprietà è già stata impostata. È possibile?
TIA, Berryl
Soluzione 3
Per chiarire in codice ciò che Stuart e Jamie stanno dicendo, ecco cosa funziona:
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);
}
}
Altri suggerimenti
.WithLengthOf()
aggiunge un " modifica " (Action<XmlElement>
) all'elenco delle modifiche da applicare quando viene generata la mappatura XML. Sfortunatamente, quel campo è private
e non ci sono proprietà per accedere all'elenco delle modifiche, quindi temo che non ci sia (attualmente) alcun modo per verificare se una mappa di proprietà è stata applicata WithLengthOf
ad essa.
Fino a quando non arriva un'alternativa migliore, puoi usare HasAttribute("length")
.