Неправильное имя столбца в таблице для стратегии подкласса с абстрактным классом в иерархии - PullRequest
3 голосов
/ 06 октября 2011

Рассмотрим следующую иерархию классов:

public abstract class Entity
{
    public virtual int Id { get; private set; }
}

public class ConfiguredBlockEntity : Entity
{
    public virtual ScheduledGreetingEntity ScheduledGreeting { get; set; }
}

public abstract class ConfiguredVariableEditableBlockEntity
    : ConfiguredBlockEntity
{
    public virtual VariableEditableBlockEntity TemplateBlock { get; set; }
}

public class ConfiguredPhoneNumberBlockEntity
    : ConfiguredVariableEditableBlockEntity
{
    public virtual string PhoneNumber { get; set; }
}

Я использую функцию автоматического преобразования Fluent NHibernate.
Это создает следующую структуру таблицы:

create table "BlockEntity" (
    Id INT IDENTITY NOT NULL,
   ExecutionOrder INT null,
   Name NVARCHAR(255) null,
   BlockType NVARCHAR(255) null,
   GreetingId INT null,
   primary key (Id)
);

create table "ConfiguredBlockEntity" (
    Id INT IDENTITY NOT NULL,
   ScheduledGreetingId INT null,
   primary key (Id)
);

create table ConfiguredPhoneNumberBlockEntity (
    ConfiguredVariableEditableBlockId INT not null,
   PhoneNumber NVARCHAR(255) null,
   VariableEditableBlockId INT null,
   primary key (ConfiguredVariableEditableBlockId)
);

alter table ConfiguredPhoneNumberBlockEntity 
    add constraint FK87F9EFC9BB9A4B52 
    foreign key (ConfiguredVariableEditableBlockId) 
    references "ConfiguredBlockEntity";

Есть некоторыепроблемы с этим результатом:

  1. В таблице ConfiguredPhoneNumberBlockEntity есть один столбец, который является первичным ключом и внешним ключом для базового класса в одном (столбец ConfiguredVariableEditableBlockId. Это выглядит странно и не соответствуеткак я обычно проектирую свои таблицы. Если бы я проектировал таблицу вручную, в ней был бы столбец Id, представляющий собой PK, и столбец ConfiguredBlockId, представляющий собой FK. Можно ли как-то изменить это с помощью беглогоили автоматическое отображение?
  2. Столбец PK / FK имеет имя ConfiguredVariableEditableBlockId, но таблицы ConfiguredVariableEditableBlock не существует, поскольку это был абстрактный базовый класс, и его свойство было включено в таблицу ConfiguredPhoneNumberBlockEntity. Этот столбец ссылается на таблицу ConfiguredBlockEntity и, следовательно, должен иметь соответствующее имя. Как это исправить в беглом или автоматическом отображении?

1 Ответ

2 голосов
/ 06 октября 2011
  1. таблица наследования не нуждается в дополнительном столбце Id, она никогда не читается отдельно или по id. Обычно его объединяют с таблицей базовых классов. Поэтому FNH по умолчанию использует этот дизайн. Вы можете реализовать свой дизайн, например, с помощью FluentMappings со скрытым идентификатором свойства как доступный только для чтения (дополнительная работа без значения).

  2. class MyJoinedSubclassConvention : IJoinedSubclassConvention,
                                       IJoinedSubclassConventionAcceptance
    {
        public void Accept(IAcceptanceCriteria<IJoinedSubclassInspector> criteria)
        {
            criteria.Expect(x => x.Name == "ConfiguredPhoneNumberBlockEntity");
        }
    
        public void Apply(IJoinedSubclassInstance instance)
        {
            instance.Key.Column("baseclassId");
        }
    }
    

Редактировать: или более общее

class MyJoinedSubclassConvention : IJoinedSubclassConvention
{
    public void Apply(IJoinedSubclassInstance instance)
    {
        Type basetype = instance.Extends;
        while (basetype.IsAbstract)
        {
            basetype = basetype.BaseType;
        }
        instance.Key.Column(basetype.Name + "Id");
    }
}
...