2010-12-13 6 views
0

Ich probiere das FluentNHibernate AutoPersistenceModel zum ersten Mal aus. Es war sehr einfach, ein einfaches Beispiel zu erstellen, aber ich habe ein Problem damit, dass es mit meiner Arbeitsweise zusammenpasst. Normalerweise arbeite ich an Schnittstellen, so dass meine Entitäten alle eine Schnittstelle implementieren und alle zugehörigen Entitäten über ihre Schnittstelle referenzieren, nicht ihren konkreten Typ. Angesichts der folgenden Klassen:FluentNHibernate AutoPersistenceModel mit Schnittstellenreferenzen

public Interface IFoo { } 

public Interface IBar { IFoo Foo { get; set; } } 

public Class Foo : IFoo { } 

public Class Bar : IBar 
{ 
    public IFoo Foo { get; set; } 
} 

Ich würde die folgende Abbildung haben:

public class BarMapping : ClassMap<Bar> 
{ 
    public AnswerMapping() 
    { 
     References<Foo>(x => x.Foo).Column("FooId").Cascade.None(); 
    } 
} 

Wie würde ich das gleiche mit dem AutoPersistenceModel erreichen? Ich habe mir Conventions und den ReferenceConvention-Builder kurz angeschaut, aber ohne jegliche Dokumentation oder Beispiele bin ich pleite.

EDIT

Ich habe wandte sich nun diese zusammen mit meinen anderen SO post auf Sammlung Mapping-Schnittstellen in einem Blog-Post: http://bronumski.blogspot.com/2011/01/making-fluent-nhibernate-automapper.html

Antwort

1

Nach einem kleinen Graben um ich mit einer Lösung gekommen sind . Es gibt eine IReferenceConvention-Schnittstelle, die ich in anderen Beispielen verwendet habe, aber dieses Szenario nicht abdecke. Durch die Implementierung der Schnittstelle und das Ausführen einer benutzerdefinierten Konvention konnte ich dasselbe mit dem AutoPersistenceModel erreichen, das ich mit ClassMap hatte.

public class ReferenceConvention : IReferenceConvention 
{ 
    public void Apply(IManyToOneInstance instance) 
    { 
     Type instanceType = instance.Class.GetUnderlyingSystemType(); 
     if (instanceType == typeof(IFoo)) 
     { 
      instance.CustomClass<Foo>(); 
     } 

     instance.Cascade.All(); 
    } 
} 

Ein generischer Ansatz könnte sein:

public class ReferenceConvention : IReferenceConvention 
{ 
    public void Apply(IManyToOneInstance instance) 
    { 
     Type instanceType = instance.Class.GetUnderlyingSystemType(); 

     if (instanceType.IsInterface) 
     { 
      // Assuming that the type starts with an I get the name of the concrete class 
      string className = instanceType.Name.Substring(1); 

      instance.CustomClass(instanceType.Assembly.GetType(
       instanceType.FullName.Replace(instanceType.Name, className))); 
     } 

     instance.Cascade.All(); 
    } 
} 

Es gibt auch eine ReferenceConventionBuilder ist, die ich noch nicht ausgesehen haben, aber diese eine sauberere Lösung sein könnten.

Verwandte Themen