Свободный NHibernate JoinedSubClass устарел - PullRequest
10 голосов
/ 23 июля 2010

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

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

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

    }
}

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

Будут благодарны за любые ответы.

Заранее спасибо!

1 Ответ

1 голос
/ 06 августа 2011

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

Я полагаю, что вы можете выполнить то, что вы хотите сделать, заставив 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
    }
}

То же самое для объекта ArchiveTag.

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

...