Извлечь одну указанную c запись из таблицы? - PullRequest
0 голосов
/ 11 марта 2020

В настоящее время я ищу способ передать первичный ключ в запись таблицы, которая указана в одной таблице и должна быть извлечена в другой таблице.

в качестве примера я создал это?

public class Parent 
{
    public string Name {get; set;}
    public virtual ICollection<child> Children
    Public virtual ICollection<School> Schools {get; set;}
}

public class Child 
{
    public string Name {get; set;}
    Public School Schoola{get; set;} // Which should be a school Name that the Parent Should know?
}


public class School
{
    //ParentID
    //ChildID
    public string SchoolName {get; set;}
}

enter image description here

Как я могу дать моему экземпляру Child имя SchoolName, которое содержит родитель в пределах SchoolNames?

Children и SchoolNames являются отдельными таблицами - но ребенок должен знать только конкретную c запись ..

1 Ответ

2 голосов
/ 11 марта 2020

Предостережение

Ваш код не работает, поскольку 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 будет другим.

А затем ограничьте вашего конечного пользователя только возможностью выбрать из представленных вариантов. Обратите внимание, что для предотвращения неверных данных необходимо дважды проверить выбранное имя после того, как пользователь выбрал его.

...