Возможно ли использовать 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)
,