У меня есть сайт. этот сайт находится в определенном часовом поясе и имеет определенный тип подключения к Интернету. Оба эти свойства хранятся в таблице сайта БД как внешние ключи к записям в отдельной таблице поиска. Я бы никогда не сделал это таким образом, но я понимаю, почему (применяет общий набор имен, дает СЛИШКОМ меньший размер БД, позволяет в некоторых случаях нормализовать дополнительную информацию и позволяет легко получить список значений для использования в качестве DDL).
Я строю отображение, которое должно включать поиск этой информации. Я хотел бы избежать создания объекта домена и сопоставления для одного поля (которое, в некоторых случаях, кроме идентификатора таблицы поиска, вот и все), поэтому вместо этого я хотел бы денормализовать отношения и просто иметь строковое значение на объекте. Простая цель.
Проблема в том, что соединение, которое я пытаюсь использовать, предполагает, что первичный ключ таблицы сайта указан где-то в таблице поиска; по сути, мы предполагаем, что сайт находится на «единственной» стороне отношений, что является неточным. Вот соответствующие линии отображения:
Id(x=>x.Id).Column("SiteID");
...
Join("lu_TimeZone", j =>
{
j.KeyColumn("TimeZoneID");
j.Map(x => x.TimeZone).Column("TimeZone");
});
Сгенерированный SQL включает соединение:
FROM Site this_0_
inner join lu_TimeZone this_0_1_
on this_0_.SiteID=this_0_1_.TimeZoneID
* зуммер * Извините, это неправильно, спасибо за игру. Объединение должно быть:
FROM Site this_0_
inner join lu_TimeZone this_0_1_
on this_0_.TimeZoneID=this_0_1_.TimeZoneID
Однако, похоже, нет способа сказать Fluent использовать KeyColumn в качестве имени столбца с обеих сторон объединения. Отменить сопоставление для присоединения TimeZone к сайту невозможно, так как существует несколько соединений с сайта на другие таблицы поиска.