2009-04-30 8 views
0

Ich mag das Muster, das ich in diesem Blogpost gesehen habe (http://marekblotny.blogspot.com/2009/04/conventions-after-rewrite.html), wo der Autor prüft, ob eine Änderung des Tabellennamens bereits vorgenommen wurde, bevor eine Konvention angewendet wird.10 Fluent NHiberte Änderungen/Konventionen

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

Antwort

0

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); 
    } 
} 
1

.WithLengthOf() fügt eine "Veränderung" (Action<XmlElement>) in die Liste der Änderungen anzuwenden, wenn die XML-Mapping erzeugt wird. Leider ist dieses Feld private und es gibt keine Eigenschaft, um auf die Änderungsliste zuzugreifen, also habe ich befürchtet, dass es (derzeit) keine Möglichkeit gibt, zu überprüfen, ob eine Property Map auf WithLengthOf angewendet wurde.

+0

Gedanke, der das Geschäft sein könnte; Es macht mir nichts aus, Konventionen für Gruppen von Stringlängen hinzuzufügen, aber viele Fälle sind Einzelfälle, die wirklich von der Klasse gesteuert werden. Wenn also eine String-Länge von EmployeeNumber 6 Zeichen lang sein sollte, ist dies entweder EmployeeNumberStringLengthConvention für das eine Feld oder eine if-Anweisung in DefaultStringLengthConvention. Thx für die schnelle Antwort. – Berryl

1

Bis eine bessere Alternative kommt, können Sie HasAttribute("length") verwenden.

+0

Das wäre gut genug, aber es funktioniert nicht. Ich habe FNH in ein paar Wochen nicht aktualisiert - ist das ein aktuelles Update? Könnte das Attribut etwas anderes als "Länge" sein? Danke für die Antwort. – Berryl

+0

Berryl, HasAttribute sollte funktionieren, wenn Sie SetAttribute verwenden. Ab Version 458 speichert WithLengthOf das Attribut "length" in einer Auflistung namens columnProperties. SetAttribute speichert in extendedProperties, wo auch HasAttribute aussieht. SetAttribute/HasAttribute hat so lange funktioniert, wie ich sagen kann, so dass es wahrscheinlich mit der von Ihnen verwendeten Version funktioniert. –