Возможно, вам понадобится обрисовать в общих чертах структуру вашей таблицы, потому что из того, что вы описываете, вы не можете просто изменить отображение с 1-ко-многим на 1-к-1 на основе схемы.
A 1- Схема to-many будет выглядеть примерно так:
Sample
SampleID (PK)
SampleResult
SampleResultID (PK)
SampleID (FK)
Схема 1-к-1 будет выглядеть следующим образом: Sample SampleID (PK)
SampleResult
SampleID (PK + FK)
Итак, в 1- Схема to-many, содержащая от 1 до 1 строки, вы имели бы Sample ID = 1 с SampleResult с SampleResultID = 16 и SampleID = 1. Если бы вы просто изменили отображение на 1-к-1, EF ожидал, что PK будут включены обе таблицы равны. Поскольку SampleResult PK - это SampleResultId, получить правильную запись невозможно, так как она будет сравнивать Sample.SampleId / w SampleResult.SampleResultId (не SampleResult.SampleId)
Ваши новые тестовые записи будут работать, потому что вы вероятно, было бы найти:
Sample.SampleID = **220**
SampleResult.SampleResultID = **220**
SampleResult.SampleID = 220
Если бы вы использовали столбцы Identity (Int) для ключей, эта проблема могла бы проявиться несколько иначе, если бы вы либо получали пустые ссылки, либо получали ссылки на неверные результаты. Поскольку вы используете GUID, и каждый идентификатор будет относительно универсально уникальным, результатом будут пустые ссылки.
Я бы порекомендовал использовать Profiler в вашей тестовой базе данных для захвата SQL, используемого при загрузке Sample / Пара результатов для проверки правильности объединения столбцов.
Без изменения схемы, если SampleResult.SampleResultId настроен как Identity / Default, и , вы можете гарантировать, что не существует экземпляров 1-ко-многим (несколько результатов на один образец), вы должны быть в состоянии обновить отображение в EF, чтобы обработать SampleId в SampleResult в качестве ключа. Таким образом, с вашим новым отображением EF свяжет 2 вместе. Это будет означать, что ваши предыдущие «новые» тестовые записи больше не будут работать, потому что они бы объединяли Sample.SampleID с SampleResult.SampleResultID, но ваши исходные записи должны работать, и новые записи также должны работать. Ключ EF не обязательно должен соответствовать PK в таблице, если вы используете DB-First (без миграций) и схема удовлетворена. Если для столбца DB для SampleResultId по умолчанию установлено значение NewSequentialId()
или NewId()
, вам не нужно беспокоиться об этом. Если в коде установлен PK, вам может потребоваться отобразить свойство как обычный столбец и сделать примечание для использования SampleId. Это может «сломаться», если у вас есть какие-либо другие объекты, ссылающиеся на SampleResult на основе SampleResultId. EF будет рассматривать SampleId в качестве ключа при присоединении.
И последнее замечание: я немного настороженно отношусь к выводу, что отношение 1-ко-многим между Sample и SampleResult привело к проблемам с производительностью, которые быть решена путем повторного сопоставления с 1-к-1. Несмотря на то, что несколько вводит в заблуждение наличие отношения «один ко многим», которое должно содержать только одного ребенка, в конце концов EF будет использовать Inner Join в обоих случаях. Я сильно подозреваю, что в игре что-то еще. Ключи GUID могут создавать проблемы c по мере роста системы, если вы используете NewId()
/ Guid.New
для новых строк. Это связано с тем, что относительная случайность 128-битного ключа в кластерном индексе может привести к значительной фрагментации в индексных таблицах. Лучше использовать NewSequentialId()
или реализацию на основе кода NewSequentialId()
для генерации уникальных, но сортируемых GUID, которые минимизируют этот эффект, и объединяют это с регулярным обслуживанием индекса для таблиц базы данных.