10

Zastanawiam się nad czymś. Siedzę tutaj z rozwiązaniem tam Mam 1 nadklasę, która ma 2 podklasy i obecnie mapuję to używając JoinedSubClass, ale dostaję, że ta metoda jest przestarzała, i mówi, że powinienem ClassMap i SubClassMap, ale jeśli to zrobię AutoMapping nie działa, a ja tego nie chcę. Czy istnieje jakieś obejście tego problemu?Fluent NHibernate ŁączonySubClass jest przestarzały

Oto hierarchia:

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

Jak zapewne zorientowali się, chcę to być tabela za hierarchii mapowanie z podklasy z list, które wiele-do-wielu. Podobnie jak tabela "Tag", a następnie Tag_Respondent i Tag_Archive (dla relacji wielu do wielu).

Oto odwzorowanie że obecnie używam:

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"); 

    } 
} 

Czy ktoś wie o obejście lub inne rozwiązanie do rozwiązywania tego? (Bez wyłączania automatyzacji)

Wszelkie odpowiedzi zostaną docenione.

Z góry dziękuję!

+0

Czy zdarzyło Ci się, że to działa? Pracuję nad podobnymi problemami, próbując uzyskać pracę z mieszaną tabelą na podklasę i tabelą na klasę. – rbellamy

+0

Czy nadal masz ten problem? Z której wersji FNH korzystałeś? – Firo

Odpowiedz

1

Przebacz mi, jeśli nie rozumiem twojego celu, ale zrobię to, ponieważ mam podobne dziedzictwo w moim projekcie (chociaż używam wzoru tabeli na klasę z kolumną dyskryminującą).

Wierzę, że można osiągnąć to, czego szukasz zrobić poprzez FNH ignorować swoją klasę Tag bazowej, a następnie przesłanianie mapowania na swoim RespondentTag i ArchiveTag obiektów wdrożyć wiele do wielu relacji. Więc w konfiguracji FNH, można określić argument do mapowania wezwanie:

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

Wtedy trzeba by założyć przesłonięcia w cokolwiek montaż jesteś ich przechowywania. Będziesz miał coś takiego:

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 
    } 
} 

To samo dla obiektu ArchiveTag.

Jest to podobne do tego, co robię w moim schemacie dziedziczenia, choć jak już wspomniałem, w mojej klasie konfiguracji automap przesłoniłem metodę IsDiscriminated, aby wskazać, że moje obiekty są klasy tabeli i klasy bazowej i są dyskryminowane.