10

Интересно о чем-то. Я сижу здесь с решением там, у меня есть 1 суперкласс, у которого есть 2 подкласса, и я в настоящее время сопоставляю это с помощью SessionSubClass, но я понимаю, что этот метод устарел и говорит, что мне нужно ClassMap и SubClassMap, но если я это сделаю AutoMapping не работает, и я не хочу этого. Есть ли обходной путь для этого?Fluent NHibernate ЗарегистрированSubClass устарел

Вот иерархия:

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

Как вы наверное поняли, что я хочу, чтобы это таблица в иерархии картирования с подклассов со списками, которые многие-ко-многим. Подобно таблице «Tag», затем Tag_Respondent и Tag_Archive (для отношений «многие ко многим»).

Вот отображение, что я в настоящее время с помощью:

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

    } 
} 

Кто-нибудь знает о обходном или другом решении для решения этого? (Без выключения автомата)

Любые ответы будут оценены.

Заранее благодарен!

+0

Вы когда-нибудь получали эту работу? Я сталкиваюсь с аналогичными проблемами, пытаясь получить смешанную таблицу за подкласс и таблицу-на-класс-иерархию. – rbellamy

+0

У вас все еще есть эта проблема? Какую версию FNH вы использовали? – Firo

ответ

1

Простите меня, если я не понимаю вашу цель, но я возьму на это удар, так как у меня есть аналогичное наследование в моем проекте (хотя я использую шаблон table-per-base-class с столбцом дискриминатора).

Я считаю, что вы можете сделать то, что вы хотите сделать, имея FNH игнорировать ваш Tag базовый класс, то отменяя отображение на ваших RespondentTag и ArchiveTag объектов для реализации многих ко-многим. Таким образом, в конфигурации FNH, вы бы указать аргумент для вашего отображений зову:

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

Тогда вы должны настроить переопределение в любой сборки вы их хранения. Вы бы что-то вроде этого:

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

Same для ArchiveTag объекта.

Это похоже на то, что я делаю в моей схеме наследования, хотя, как я уже упоминал, в моем классе конфигурации automap я переопределяю метод IsDiscriminated, чтобы указать, что мои объекты являются таблицами на основе базового класса и различаются.