Возможно ли использовать CustomSqlType с CompositeId?

При работе с устаревшими таблицами необходимо создать CompositeId на основе двух полей char(3). Не вижу никаких перегрузок, которые делают это возможным с Fluent.

Сопоставление, которое я пытаюсь сделать, выглядит следующим образом:

CompositeId()
.KeyProperty(x => x.LegacyEntity1Id, "LegacyEntity1Id")
.KeyProperty(x => x.LegacyEntity2Id, "LegacyEntity2Id");

Map(x => x.LegacyEntity1Id).CustomSqlType("char(3)");
Map(x => x.LegacyEntity2Id).CustomSqlType("char(3)");

Я также попробовал:

CompositeId()
    .KeyReference(x => x.LegacyEntity1, "LegacyEntity1Id")
    .KeyReference(x => x.LegacyEntity2, "LegacyEntity2Id");

Map(x => x.LegacyEntity1Id).CustomSqlType("char(3)");
Map(x => x.LegacyEntity2Id).CustomSqlType("char(3)");

Оба результата приводят к одному и тому же результату - таблица генерируется с правильным составным идентификатором, но оба столбца являются nvarchar по умолчанию (255). В результате внешние ключи не генерируются, и я получаю исключение, так как родительские таблицы имеют тип char(3).

Разве это невозможно сопоставить через Fluent?

Если нет, есть ли реальная разница в отображении этого типа *:

Id(x => x.Id).GeneratedBy.Identity();

Map(x => x.LegacityEntity1Id).CustomSqlType("char(3)");
Map(x => x.LegacityEntity2Id).CustomSqlType("char(3)");

References(x => x.LegacityEntity1).Column("LegacityEntity1Id").UniqueKey("1").Not.Nullable();
References(x => x.LegacityEntity2).Column("LegacityEntity2Id").UniqueKey("1").Not.Nullable();

* У меня есть возможность немного изменить таблицы (достаточно для добавления идентификатора), так как устаревшие таблицы ETLed в локальный экземпляр SQL.

Или есть другой альтернативный подход? Не может использовать HasManyToMany в этом случае, для чего это стоит (будет иметь полезную нагрузку).

2 ответа

Вот как это сделать в 2017 году:

CompositeId()
  .KeyProperty(
     x => x.LegacyEntity1Id, 
     k => k.ColumnName("LegacyEntity1Id").Type("AnsiString").Length(3))
  .KeyProperty(
     x => x.LegacyEntity2Id, 
     k => k.ColumnName("LegacyEntity2Id").Type("AnsiString").Length(3))

KeyReference будет искать карту ссылочной сущности и использует там sqltype. перейти к ссылочным объектам и указать Id(x => x.Id).Length(3),

Другие вопросы по тегам