@andrey71
админю и учу C#, ASP.NET Core

EF Core Загрузка трёх и более сущностей. Как правильно?

Добрый день! Подскажите пожалуйста, чисто теоретически, возможно ли сделать загрузку множества связных с сущностью данных без использования связующей сущности?
Получилось так, что есть проект с БД на mysql и вносить изменения в структуру БД я не могу. :(
У меня есть Сотрудник, есть Должности сотрудника и есть сканы приказов о назначении на должность сотрудника. Для связи Сотрудника и Должностью сотрудника – используется внешний ключ. А между Должностью и Сканом приказа – связи по внешнему ключу нет. Есть просто номер, который соответствует id в таблице Скана.
И почему-то не получается эту связь сделать не через Аннотации не через Fluent API.
При построении модели, данные о приложенном Скане не подгружаются.
Прошу Вашей помощи.
public class Employee
    {
        [Key, ForeignKey("employee")]
        public long Id { get; set; }        
        public string FIO {get; set;}        
        [ForeignKey("position")]
        public Position Position { get; set; }        
        public DateTime Bithday { get; set; }
}
public class Position
    {
        [Key]
        public long Id { get; set; }
        [ForeignKey("employee ")]
        public Employee Employee { get; set; }        
        public AttachedFile File { get; set; }
        // UPD
       public string PosName { get; set; }
}
public class AttachedFile
    {
        [Key]
        public long Id { get; set; }
        public string FileName { get; set; }
}
Загружаю данные для передачи в представление:
public IActionResult Details(int id)
        {
            var model = db.employees
                .Include(ep => ep.Position)                
                .FirstOrDefault(j => j.Id == id)                
                ;

            return View(model);
        }

Сослаться на загрузку данных по сущности AttachedFile не получается. Получаю исключение что ссылка не указывает на экземпляр объекта.

Я использую ASP.NET Core 2.1 + EF

Спасибо!

UPD!

employees

---------------------------------------------------
| id | FIO | position | Bithday |
1 Тестер О.О. 2 01.01.2010
2 Тестеров Д.Д 3 02.06.2000

positions

--------------------------
id employees file posname
1 1 1 Менеджер
2 1 3 Ст.Менеджер
3 2 2 Бухгалтер
4 2 4 Ст.Бухгалтер

files

-----------------------------
id filename
1 Приказ №1.docx
2 Приказ №341.docx
3 Приказ №3.docx
4 Приказ №167.docx

Необходимый вариант отображения данных.
Таблица "Карьерный рост" сотрудника Тестер О.О.

Должность Скан приказа

Менеджер Приказ №1.docx
Ст.Менеджер Приказ №3.docx
5e07368084683081117134.png
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 2
@kttotto
пофиг на чем писать
1.
Есть просто номер, который соответствует id в таблице Скана.

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

2. Не лучшее решение на вьюшку отдавать entity сущность. Лучше добавить модель DetailsViewModel, которую Вы заполните данными как хотите. Например
var detailsViewModel = db.employees.Include(ep => ep.Position)                
			.Where(j => j.Id == id)
			.Select(emp => new EmploeeViewModel
			{
				Name = emp.Name,
				Position = emp.Position,
				Сontract = db.Contract.FirstOrDefault(c => c.Id == emp.ContractId)
			}.FirstOrDefault();
			
return View(detailsViewModel);
Ответ написан
yarosroman
@yarosroman
C# the best
public AttachedFile? File .... Таким способом объявите поле, скорее всего дело вот почему, у вас автоматом создаётся поле FileId и оно не nullable, поэтому и исключение выскакивает, скорее всего.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы