#entity-framework #api #object #.net-core
#entity-framework #API #объект #.net-core
Вопрос:
Я пытаюсь отобразить дочерний объект в моем приложении .net core api. У меня следующая настройка;
public class Accounts
{
[Key]
public int AccountId { get; set; }
public string AccountName { get; set; }
public int AccountStatusId { get; set; }
public List<AccountStatus> AccountStatus { get; } = new List<AccountStatus>();
}
public class AccountStatus
{
public int AccountStatusId { get; set; }
public string AccountStatusName { get; set; }
}
Который отображается в моем контроллере, связывает это:
[HttpGet]
public IEnumerable<Accounts> Get()
{
return this._internalContext.Accounts.ToList();
}
Это работает, но я ожидал, что AccountStatus будет показан в результате с элементом AccountStatusName для использования в моем json API. В его нынешнем виде он возвращает это:
{
"accountId": 1,
"accountName": "Toms Mega Mix",
"accountStatusId": 1,
"accountStatus": []
},
Где я ожидал, что он сделает что-то вроде этого:
{
"accountId": 1,
"accountName": "Toms Mega Mix",
"accountStatusId": 1,
"accountStatus": [{"AccountStatusName":"Active"}]
},
Возврат статуса учетной записи
{
"accountStatusId": 1,
"accountStatusName": "Customer"
},
{
"accountStatusId": 2,
"accountStatusName": "Supplier"
},
{
"accountStatusId": 3,
"accountStatusName": "Ex Customer"
}
Предположительно, я должен как-то связать их, но не могу понять, как
Комментарии:
1. Проверка работоспособности, вы уверены, что список действительно заполнен и так далее — может быть, вывести
this._internalContext.Accounts.ToList()
, прежде чем вернуться к проверке?
Ответ №1:
Это не общий вопрос .NET Core, а основной вопрос Entity Framework.
Обновить
Основываясь на нашем разговоре в чате, похоже, вам просто нужен только один AccountStatus
per Account
.
Итак, это должно сработать:
public class Accounts
{
[Key]
public int AccountId { get; set; }
public string AccountName { get; set; }
// Optional ID property for Entity Framework navigation to another table. If you don't define it, it will be implicitly created by Entity Framework
public int AccountStatusId { get; set; }
public AccountStatus AccountStatus { get; set; }
}
Предыдущий ответ:
Чтобы загрузить данные из другой таблицы, Entity Framework необходимо объединить таблицы. Это немного дороже, чем просто запрос одной таблицы.
Итак, вам нужно сказать EF, чтобы он сделал это за вас. Например, вы можете явно загрузить данные из связанной таблицы с помощью .Include()
.
this._internalContext.Accounts
// In general, this should help:
.Include(a => a.AccountStatus)
.ToList();
В вашем конкретном примере вам также необходимо исправить Accounts
класс, если вы хотите отношения «один ко многим». Когда у многих учетных записей может быть один статус.
AccountStatus
собственность должна быть такой:
public class Accounts
{
[Key]
public int AccountId { get; set; }
public string AccountName { get; set; }
public virtual ICollection<AccountStatus> AccountStatus { get; set; }
}
В общем, если вы хотите по какой-либо причине иметь отношения «многие ко многим», вам необходимо ввести промежуточную сущность (и таблицу) для этого.
Давайте представим, что у нас есть Course
сущность. Тогда вы можете назначить несколько учетных записей одному курсу. И каждая учетная запись может быть назначена многим курсам. Это отношение «многие ко многим».
В то же время у вас есть статус учетной записи для каждой учетной записи.
Итак, схема будет выглядеть следующим образом:
AccountToCourse
сущность требуется для отношений «многие ко многим» между Account
Course
объектами и.
Ознакомьтесь с более подробной информацией об этом и другими способами управления поведением при загрузке данных:
Microsoft Docs / Entity Framework Core / Данные запроса / Данные, связанные с запросом
Комментарии:
1. Привет, спасибо за вашу помощь. Это имеет смысл, но, к сожалению, статус учетной записи по-прежнему возвращается как «accountStatus»: []
2. Вы обновили
Accounts
класс? Каково его текущее состояние?3. Привет, да, я думаю, что у меня есть учетные записи общедоступного класса { [Key] public int AccountId { get; set; } public string AccountName { get; set; } public int AccountStatusId { get; set; } public virtual ICollection<AccountStatus> AccountStatus { get; set; } }
4. @TMB87 Какая структура БД у вас есть с точки зрения этих двух классов:
Accounts
,AccountStatus
?5. Точно так же, как и объекты (созданные entity framework). Я добавил возврат AccountStatus к исходному вопросу, они были сгенерированы EF и находятся в базе данных sqlite