26 / 26 / 13
Регистрация: 01.07.2016
Сообщений: 105
1

Получение значений дочернего элемента базы данных через контекст Entity Framework

10.11.2020, 16:19. Показов 594. Ответов 1

Author24 — интернет-сервис помощи студентам
Доброго времени суток, ув. знатоки!)
В общем по порядку:

Имеется модель Exhibit
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace GalleryWebMVC.Models.DBModels
{
    public class Exhibit
    {
        public int ID { get; set; }
        public Author Author { get; set; }
        public string Name { get; set; }
        public byte[] Image { get; set; }
        public string Description { get; set; }
        public double Price { get; set; }
        public ExhibitStatus Status { get; set; }
        public Exposition Exposition { get; set; }
    }
}


Само собой, контекст DBContext
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
namespace GalleryWebMVC.Models
{
    public class DBContext : DbContext
    {
        #region public_DataBaseSet_properties
        public DbSet<User> Users { get; set; }
        public DbSet<Exhibit> Exhibits { get; set; }
        public DbSet<ExhibitStatus> ExhibitStatuses { get; set; }
        public DbSet<Author> Authors { get; set; }
        public DbSet<Contract> Contracts { get; set; }
        public DbSet<Exposition> Expositions { get; set; }
        public DbSet<Role> Roles { get; set; }
        #endregion public_DataBaseSet_properties
 
        #region Constructor
        public DBContext(DbContextOptions<DBContext> options) :base(options)
        {
            Database.EnsureCreated();
        }
        #endregion Constructor
        
        ...
        
    }      
}


Представление для добавления данных выглядит следующим образом

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@{
    ViewData["Title"] = "Добавление экспоната";
}
@model GalleryWebMVC.ViewModels.AddExhibitViewModel
 
<form asp-action="Add" asp-controller="Exhibits" class="col-lg-12 col-sm-12 mt-1 card">
    <div class="form-group">
        <label for="Image">Фотография</label>
        <!-- Попробовать в дальнейшем множественную загрузку-->
        <input type="file" class="form-control-file">
    </div>
    <div class="form-group">
        <label asp-for="Name" class="control-label">Название экспоната</label>
        <input type="text" asp-for="Name" class="form-control" />
    </div>
    <div class="form-group">
        <label asp-for="AuthorID" class="control-label">Автор произведения</label>
        <select class="form-control" asp-for="AuthorID">
 
            @foreach (GalleryWebMVC.Models.DBModels.Author author in ViewBag.Authors)
            {
                <option value="@author.ID">@author.Name @author.Surname</option>
            }
        </select>
    </div>
    <div class="form-group">
        <label asp-for="Description" class="control-label">Описание</label>
        <input type="text" asp-for="Description" class="form-control" />
    </div>
    <div class="form-group">
        <label asp-for="Price" class="control-label">Стоимость</label>
        <input type="number" asp-for="Price" class="form-control" />
    </div>
    <div class="form-group">
        <label asp-for="ExpositionID" class="control-label">Выставка</label>
        <select class="form-control" asp-for="ExpositionID">
            @foreach (GalleryWebMVC.Models.DBModels.Exposition exposition in ViewBag.Expositions)
            {
                <option value="@exposition.ID">@exposition.StartDate.ToShortDateString() @exposition.EndDate.ToShortDateString()</option>
            }
        </select>
    </div>
    <div class="form-group">
        <input type="submit" value="Отправить" class="btn btn-default" />
    </div>
</form>

Тут порядок, все работает.

Дальше в дело вступает метод контрола Add
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[HttpPost]
        public async Task<IActionResult> Add(AddExhibitViewModel exhibitViewModel)
        {
            //Создаем и инициализируем новый экземляр Exhibit
            Exhibit exhibit = new Exhibit
            {
                Author = DB.Authors.FirstOrDefault(a => a.ID == exhibitViewModel.AuthorID),
                Description = exhibitViewModel.Description,
                Name = exhibitViewModel.Name,
                Price = exhibitViewModel.Price,
                Status = DB.ExhibitStatuses.FirstOrDefault(s => s.ID == exhibitViewModel.StatusID) ?? DB.ExhibitStatuses.FirstOrDefault(s => s.ID == 1),
                Exposition = DB.Expositions.FirstOrDefault(e => e.ID == exhibitViewModel.ExpositionID) 
            };
            // Обработка изображения
            if (exhibitViewModel.Image != null)
            {
                byte[] imageData = null;
                // Файл -> масив байт
                using (var binaryReader = new BinaryReader(exhibitViewModel.Image.OpenReadStream()))
                    imageData = binaryReader.ReadBytes((int)exhibitViewModel.Image.Length);
                // установка массива байт в свойство
                exhibit.Image = imageData;
            }
            //Добавляем
            DB.Exhibits.Add(exhibit);
            //Сохраняем
            await DB.SaveChangesAsync();
            //Отправляем домой
            return RedirectToAction("Index");
        }

Тут тоже всё хорошо отработало, данные в базу загнало и отправило домой (на Index).


А вот уже дома должно произойти следующее (Получаем все строки из таблицы Exhibits и отправляем во View)
C#
1
2
3
4
5
6
7
        [HttpGet]
        public async Task<IActionResult> Index()
        {
            IEnumerable<Exhibit> allExhibits = await DB.Exhibits.ToArrayAsync();
 
            return View(allExhibits);
        }
View выглядит следующим образом:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@{
    ViewData["Title"] = "Экспонаты";
}
@model IEnumerable<GalleryWebMVC.Models.DBModels.Exhibit>
<div class="col-lg-12 col-sm-12 mt-1">
 
    @foreach (GalleryWebMVC.Models.DBModels.Exhibit exhibit in Model)
    {
        <div class="card m-b-30">
            <img class="card-img-top" src="@exhibit.Image" alt="Alternate Text" />
            <div class="card-body">
                <h2 class="card-title">@exhibit.Name</h2>
                <p>@exhibit.Description</p>
                <p>Автор: @exhibit.Author.Name @exhibit.Author.Surname</p>
                <p>Цена: @exhibit.Price.ToString("c")</p>.
            </div>
        </div>
    }
</div>


И вот тут как раз проблема:
Получить обратно нормально уже не выходит - при обращении к свойству Name дочернего элемента Author - вылетает NullReferenceEx. - 1 скриншот

Все Null-ы он получает еще на запросе значений из БД в вызове метода DB.Exhibits.ToArrayAsync() - 2 скриншот

То, что лежит в БД под капотом - 3 скриншот
В таблицу Exhibits должна ложиться модель Exhibit, которая под первым спойлером.
Там в качестве свойств Author, Status и Exposition указаны объекты.
При внесении в бд EF вешает на их места ID-шники.
Но как выковыривать теперь обратно? Обратиться напрямую к свойству свойства ( извиняйте за тавтологию) не получается
В принципе, ничего против автоматически созданных столбцов не имею, но
откуда взялась колонка UserID, если в модели вообще не имеется таких свойств?
и как всё же получить обратно нужные мне значения дочерних эл-ов, если запрос через контекст возвращает null в выделенных полях?
Т.е. я даже не смогу найти нужный элемент по тому самому ID,что лежит в БД, потому что таких полей не существует в контексте.

Как быть?

Не по теме:

Еще только изучаю сей прекрасный мир ASP.NET Core, сильно не бейте))



Добавлено через 12 минут
Помогите удалить дубль, если такое возможно, я хотел только заголовок дополнить.
@Administrator, как-то неправильно редактирование сработало)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2020, 16:19
Ответы с готовыми решениями:

Получение объекта через Entity Framework
Привет всем. Подскажите пожалуйста со следующим вопросом. Насколько мне известно, при...

Апдейт базы через Entity Framework, вылет с ошибкой
Делаю апдейт в базе с помощь Entity Framework. На 1 сервере работает, перенёс на другой -...

Удалить запись из базы данных с использованием Entity Framework
Я использую Entity Framework. Я хотел бы удалить запись основанную на primary key, но я не хочу...

Entity Framework. Ошибки при создании EntityModel из базы данных
Народ. Вот есть база данных Всё вроде нормально в ней составлено, но при создании модели данных...

1
Эксперт .NET
12061 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,559
13.11.2020, 07:33 2
Цитата Сообщение от SasukeSagara Посмотреть сообщение
Как быть?
Читать документацию.
1
13.11.2020, 07:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2020, 07:33
Помогаю со студенческими работами здесь

Entity Framework: сбой кодировки при создании базы данных
Всем доброго дня! Происходит следующая ситуация. Разрабатываю систему на одном компе, SQL...

Entity framework - как выводятся таблицы из базы данных посредством DataGridView?
В общем у меня есть база данных sql, подключенная к студии с помощью EF, на форме выводятся таблицы...

SQLite и Entity Framework. Ошибка при создании базы данных по EDMX модели
Ошибка при создании базы данных по EDMX модели.

Видимость базы данных в обозревателе серверов при использовании Code First Entity Framework
Доброго времени суток! Только осваиваю и .Net, и C#. Сейчас на разбираюсь с подходом Code First с...

Странное поведение Entity Framework. Перезапись базы данных, которая не соответствует схеме модели
Подскажите пожалуйста. Я использую в своем приложения Entity Framework, дизайн Code First. Я...

Дабавление данных в таблицу через Entity Framework
Не получается добавить данные в таблицу. Ошибку не выдает. Сохранял проэкт. private void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru