Быстрая проблема наследования NHibernate

Я использую Nhibernate с Быстрым, и я встречаюсь с проблемой с наследованием.

Здесь моя схема DB

Основа ТАБЛИЦЫ

  • IDBASE (PK)
  • Field1
  • ВВЕСТИ

ТАБЛИЦА T1

  • IDBASE (PK и FK)
  • Field2
  • Field3...

Мои файлы отображения:

public class BaseMap: ClassMap<BASE>
{
    public BaseMap()
    {
        Id(x => x.Id, "IDBASE").GeneratedBy.Identity();

        Map(x => x.Field1);
        DiscriminateSubClassesOnColumn("TYPE");
    }
 }

    public class T1Map: SubclassMap<T1>
    {

        public T1Map()
        {
            Table("T1");
            KeyColumn("IDBASE");
            DiscriminatorValue("T1");

            Map(x => x.Field2).Not.Nullable();
            Map(x => x.Field3).Not.Nullable();
        }
    }

Я использую FluentMappings вместо AutoMapping.

Здесь мои объекты:

public abstract class BASE
{
   public virtual long IdBase{ get; set; }
   public virtual string Field1 { get; set; }
}

public class T1: BASE
{
    public virtual string Field2 { get; set; }
    public virtual string Field3 { get; set; }
}

Объект T1 наследовался ОСНОВНОМУ объекту, проблема - когда я пытаюсь получить строку, NHibernate пытаются выбрать Field2 и Field3 на Базовой таблице, тогда как они должны быть выбраны на Таблице T1.

Я попробовал десятки взломов, но это все еще не работает, если бы кто-либо как идея это было бы очень полезно.

Большое спасибо.

1
задан Webflo 12 August 2010 в 13:29
поделиться

2 ответа

Вы указываете дискриминатор, который подразумевает, что структура наследования должна быть иерархией таблица-класс; у вас не будет двух таблиц с этой настройкой, у вас будет одна таблица со всем содержимым (поэтому выбор попадает в одну и ту же таблицу для всех столбцов).

Если вы удалите вызов DiscriminateSubclassesOnColumn , ваши сопоставления будут помещены в таблицу для каждого класса, так что вы получите желаемую структуру.

2
ответ дан 2 September 2019 в 22:13
поделиться

На самом деле мне действительно нужен DiscriminateSubclassesOnColumn , поэтому я нашел другое решение, в моем унаследованном объекте я выполняю сопоставление с соединением следующим образом:

public class T1Map: SubclassMap<T1>
{

    public T1Map()
    {
        Join("T1", y =>
        {
            y.KeyColumn("IDBASE");
            y.Map(x => x.Field2).Not.Nullable();
            y.Map(x => x.Field3).Not.Nullable();
        }); 
    }
}

И он отлично работает , Я могу сохранить столбец Дискриминатор в моем базовом классе.

Спасибо

0
ответ дан 2 September 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: