Fluent NHibernate Änderungen / Konventionen
-
03-07-2019 - |
Frage
Ich mag das Muster, das ich in diesem Blog-Post sah ( http: //marekblotny.blogspot.com/2009/04/conventions-after-rewrite.html ), in dem der Autor zu sehen, ist die Überprüfung, ob ein Tabellenname Änderung ist bereits erfolgt, bevor eine Konvention anzuwenden.
public bool Accept(IClassMap target)
{
//apply this convention if table wasn't specified with WithTable(..) method
return string.IsNullOrEmpty(target.TableName);
}
Die Konvention Schnittstelle ich bin für eine String-Länge verwendet, ist 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);
}
}
Ich sehe nicht, wo IProperty etwas macht, das mir sagt, wenn die Eigenschaft bereits festgelegt worden ist. Ist das möglich?
TIA, Berryl
Lösung 3
in Code zu klären, was Stuart und Jamie sagen, hier ist, was funktioniert:
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);
}
}
Andere Tipps
.WithLengthOf()
fügt eine „Änderung“ (Action<XmlElement>
) in der Liste der Änderungen anzuwenden, wenn der XML-Mapping erzeugt wird. Leider, das Feld ist private
und es gibt keine Eigenschaft, um die Änderung Liste zuzugreifen, so dass ich fürchte, es ist (derzeit) keine Möglichkeit, wenn eine Eigenschaft Karte WithLengthOf
an sie angelegt hat zu überprüfen.
Bis eine bessere Alternative entlang kommt, können Sie HasAttribute("length")
verwenden.