Предостережение
Ваш код не работает, поскольку EF не сериализует коллекции примитивных типов . EF Core имеет преобразование значений , но неясно, что именно вы ищете. Я собираюсь предположить, что вы хотели сохранить их как действительные School
сущности, поскольку ваш вопрос спрашивает, как "извлечь одну запись из таблицы ".
Ради ответа на ваш вопрос, я предполагаю, что у вашего ребенка должна быть ссылка на школьную сущность, а не строковое свойство, которое технически не связано с самой школьной сущностью, что сделало бы его вопросом, не связанным с Entity Framework, и, следовательно, теги вопросов были бы неправильными.
Я расскажу и мое предположение, и ваш буквальный вопрос, просто чтобы быть уверенным.
Если вам нужны отношения между ребенком и школой
С точки зрения чисто базы данных, нет способа указать, что субъект (Child) Внешний ключ должен относиться к объекту (Школе), который сам по себе имеет внешний ключ к другому объекту (Родителю). Он просто не существует в SQL, и поэтому EF не может сгенерировать это поведение для вас.
Что вы можете сделать, это выполнить проверку бизнеса в своем коде и отказаться от хранения любого ребенка в школе, которая не ' принадлежит своему родителю. Имейте в виду, это требует, чтобы вы загружали родителя и его школы каждый раз, когда вы хотите сохранить ребенка в базу данных (потому что в противном случае вы не сможете проверить, разрешена ли выбранная школа для этого ребенка), так что это станет несколько дорогая операция.
Однако это не исключает возможности для кого-либо вводить данные в базу данных (обходя ваши бизнес-логи c, например, администратором БД), где это правило нарушается, но само ограничение FK
Как вы справляетесь с этими ошибочными состояниями данных, зависит только от вас. Вы удаляете эти записи, когда наталкиваетесь на них? Вы предварительно активно сканируете базу данных? Вы разрешаете ему существовать, но ограничиваете пользователей вашего приложения только выбором школ из сферы действия родителей? Это все деловые решения, которые мы не можем принять за вас.
Если ребенку нужно название школы без отношения к самой школе
На первый взгляд Мне кажется, это плохое решение. Что происходит, когда название школы меняется? Разве вы не ожидаете, что название школы ребенка также изменится? Потому что в вашей текущей установке этого не произойдет.
В любом случае, если вы хотите установить строковое свойство, это тривиально, вы просто устанавливаете это свойство. Предположительно, ваш вопрос заключается в том, как ограничить параметры пользователя школами родителей ребенка.
Этот ограничительный список можно получить из базы данных, используя идентификатор ребенка:
var childID = 123;
var schoolsFromParent = db
.Children
.Where(c => c.Id == childId)
.Select(c => c.Parent.Schools)
.FirstOrDefault();
Примечание что этот код работает независимо от того, есть ли у вас сущность School
или список строк - хотя тип schoolsFromParent
будет другим.
А затем ограничьте вашего конечного пользователя только возможностью выбрать из представленных вариантов. Обратите внимание, что для предотвращения неверных данных необходимо дважды проверить выбранное имя после того, как пользователь выбрал его.