10

Ich wundere mich über etwas. Ich sitze hier mit einer Lösung dort habe ich 1 Superklasse, die 2 Unterklassen hat und ich bin dies derzeit mit JoinedSubClass zuordnen, aber ich bekomme, dass diese Methode veraltet ist, und sagt, dass ich ClassMap und SubClassMap sollte, aber wenn ich das tue das AutoMapping funktioniert nicht, und das möchte ich nicht. Gibt es einen Workaround dafür?Fluent NHibernate JoinedSubClass ist veraltet

Hier ist die Hierarchie:

public class Tag : Entity 
{ 

public virtual string Name {get;set;} 
public virtual User User {get;set;} 

} 

public class RespondentTag : Tag 
{ 
    public virtual IList<Respondent> Respondents {get;set;} 
} 


public class ArchiveTag : Tag 
{ 
    public virtual IList<Survey> Surveys {get;set;} 
} 

Wie Sie wahrscheinlich herausgefunden ich diese eine Tabelle pro Hierarchie-Mapping mit den Unterklassen mit Listen sein wollen, die Many-to-many sind. Wie eine Tabelle 'Tag', dann Tag_Respondent und Tag_Archive (für Viele-zu-Viele-Beziehung).

Hier ist die Abbildung, die ich zur Zeit mit:

public class TagMap : IAutoMappingOverride<Tag> 
{ 
    public void Override(AutoMapping<Tag> mapping) 
    { 
    //This is obsolete 
    mapping.JoinedSubClass("RespondentTagId", RespondentTagMap.AsJoinedSubClass()); 
    mapping.JoinedSubClass("ArchiveTagId", ArchiveTagMap.AsJoinedSubClass()); 

    } 
} 

public class RespondentTagMap 
{ 
    public static Action<JoinedSubClassPart<RespondentTag>> AsJoinedSubClass() 
    { 
    return part => 

     part.HasManyToMany(x => x.RespondentList) 
      .Cascade 
      .SaveUpdate() 
      .Inverse() 
      .Table("Tag_Respondent"); 

    } 
} 


public class ArchiveTagMap 
{ 
    public static Action<JoinedSubClassPart<ArchiveTag>> AsJoinedSubClass() 
    { 
    return part => 

     part.HasManyToMany(x => x.Surveys) 
      .Cascade 
      .SaveUpdate() 
      .Inverse() 
      .Table("Tag_Archive"); 

    } 
} 

Kennt jemand über dieses Problem zu umgehen oder eine andere Lösung dieses für die Lösung? (Ohne das automatische Zuweisen zu deaktivieren)

Alle Antworten werden geschätzt.

Vielen Dank im Voraus!

+0

Haben Sie das jemals funktioniert? Ich stehe auf ähnliche Probleme, die versuchen, eine gemischte Tabelle-pro-Unterklasse und Tabelle-pro-Klasse-Hierarchie zu arbeiten. – rbellamy

+0

haben Sie immer noch dieses Problem? Welche Version von FNH hast du benutzt? – Firo

Antwort

1

Verzeihen Sie, wenn ich Ihr Ziel falsch verstehe, aber ich werde einen Stich machen, da ich eine ähnliche Vererbung in meinem Projekt habe (obwohl ich ein Tabelle-pro-Basis-Klasse-Muster mit einer Diskriminator-Spalte verwende).

Ich glaube, können Sie erreichen, was Sie suchen, indem FNH ignorieren Ihre Tag Basisklasse zu tun, dann überschreibt die Abbildung auf Ihrem RespondentTag und ArchiveTag Objekte, die viele-zu-viele-Beziehung zu implementieren. Also in Ihrem FNH Konfiguration, würden Sie ein Argument Ihre Zuordnungen Aufruf angeben:

m.AutoMappings.Add(AutoMap.AssemblyOf<SomeObjectInMyAssembly>(new MyAutoMapConfig()) // Assuming you're using a config class 
    .IgnoreBase(typeof(Entity)) 
    .IgnoreBase(typeof(Tag)) 
    .UseOverridesFromAssemblyOf<SomeOverrideClass>()); 

Dann würden Sie auf Überschreibungen in gesetzt haben, was auch immer Montage, dass Sie sie speichern. Sie würden so etwas wie dieses:

public class RespondentTagOverride : IAutoMappingOverride<RespondentTag> 
{ 
    public void Override(AutoMapping<RespondentTag> mapping) 
    { 
     mapping.HasManyToMany(x => x.RespondentList) 
      .Cascade 
      .SaveUpdate() 
      .Inverse() 
      .Table("Tag_Respondent"); // Not sure if the table call works in the override...you may have to use a convention for this 
    } 
} 

Das Gleiche gilt für die ArchiveTag Objekt.

Das ist ähnlich, was ich in meinem Vererbungsschema mache, obwohl, wie ich bereits erwähnt habe, überschreibe ich in meiner AutoMap Config-Klasse die IsDiscriminated Methode, um anzuzeigen, dass meine Objekte Tabelle-pro-Basis-Klasse und diskriminiert sind.