Как добавить дочерние записи в родительскую сущность в EF Core?C#

Место общения программистов C#
Ответить
Гость
 Как добавить дочерние записи в родительскую сущность в EF Core?

Сообщение Гость »


Я изучаю EF Core и создаю простое приложение.

Я получаю следующее исключение:

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: 'Операция базы данных должна была повлиять на 1 строку(и), но на самом деле затронула 0 строк; данные могли быть изменены или удалены с момента загрузки объектов.

Мой код:

public GetEmployeeDto GetById (int id) { вернуть _dbContext.Сотрудники .Where(e => e.Id == id) .Include(d => d.Зависимые) .FirstOrDefault(); } // это блок кода ошибки public void Add (int сотрудникаId, GetDependentDto newDependent) { вар сотрудник = GetById (employeeId); сотрудник.Зависимые.Добавить(новыйЗависимый); // здесь выброшено исключение _dbContext.SaveChanges(); } публичный класс GetEmployeeDto { общественный ИНТ Id {получить; набор; } общедоступная строка? Имя {получить; набор; } общедоступная строка? Фамилия {получить; набор; } [Точность(18, 2)] общественная десятичная зарплата {get; набор; } общественный DateTime DateOfBirth {получить; набор; } общественный ICollection Зависимые {get; набор; } = новый список(); } общедоступный класс GetDependentDto { общественный ИНТ Id {получить; набор; } общедоступная строка? Имя {получить; набор; } общедоступная строка? Фамилия {получить; набор; } общественный DateTime DateOfBirth {получить; набор; } Отношения с общественностью Отношения {get; набор; } } Код SQL

Выполнена команда DbCommand (2 мс) [Parameters=[@p5='?' (DbType = Int32), @p0='?' (DbType = DateTime2), @p1='?' (Размер = 4000), @p2='?' (DbType = Int32), @p3='?' (Размер = 4000), @p4='?' (DbType = Int32)], CommandType='Текст', CommandTimeout='30'] ВЫКЛЮЧИТЬ IMPLICIT_TRANSACTIONS; УСТАНОВИТЬ NOCOUNT ON; ОБНОВЛЕНИЕ [Зависимые лица] SET [DateOfBirth] = @p0, [FirstName] = @p1, [GetEmployeeDtoId] = @p2, [LastName] = @p3, [Relationship] = @p4 ВЫХОД 1 ГДЕ [Id] = @p5; Вот таблицы:

CREATE TABLE [dbo].[Сотрудники] ( [Id] [int] IDENTITY(1,1) NOT NULL, [Имя] [nvarchar](макс) NULL, [Фамилия] [nvarchar](макс) NULL, [Заработная плата] [десятичный](18, 2) НЕ НОЛЬ, [DateOfBirth] [datetime2](7) НЕ NULL, ОГРАНИЧЕНИЕ [PK_Сотрудники] КЛАСТЕРНЫЙ ПЕРВИЧНЫЙ КЛЮЧ ([Id] ASC) С (PAD_INDEX = ВЫКЛ, STATISTICS_NORECOMPUTE = ВЫКЛ, IGNORE_DUP_KEY = ВЫКЛ, ALLOW_ROW_LOCKS = ВКЛ, ALLOW_PAGE_LOCKS = ВКЛ, OPTIMIZE_FOR_SEQUENTIAL_KEY = ВЫКЛ) ВКЛ [ПЕРВИЧНЫЙ] ) НА [ПЕРВИЧНЫЙ] TEXTIMAGE_ON [ПЕРВИЧНЫЙ] ИДТИ СОЗДАТЬ ТАБЛИЦУ [dbo].[Зависимые] ( [Id] [int] IDENTITY(1,1) NOT NULL, [Имя] [nvarchar](макс) NULL, [Фамилия] [nvarchar](макс) NULL, [DateOfBirth] [datetime2](7) НЕ NULL, [Отношения] [int] НЕ NULL, [GetEmployeeDtoId] [int] NULL, ОГРАНИЧЕНИЕ [PK_Dependents] КЛАСТЕРНЫЙ ПЕРВИЧНЫЙ КЛЮЧ ([Id] ASC) С (PAD_INDEX = ВЫКЛ, STATISTICS_NORECOMPUTE = ВЫКЛ, IGNORE_DUP_KEY = ВЫКЛ, ALLOW_ROW_LOCKS = ВКЛ, ALLOW_PAGE_LOCKS = ВКЛ, OPTIMIZE_FOR_SEQUENTIAL_KEY = ВЫКЛ) ВКЛ [ПЕРВИЧНЫЙ] ) НА [ПЕРВИЧНЫЙ] TEXTIMAGE_ON [ПЕРВИЧНЫЙ] ИДТИ ALTER TABLE [dbo].[Зависимые] С ПРОВЕРКОЙ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_Dependents_Employees_GetEmployeeDtoId] ВНЕШНИЙ КЛЮЧ([GetEmployeeDtoId]) ССЫЛКИ [dbo].[Сотрудники] ([Id]) ИДТИ ALTER TABLE [dbo].[Dependents] ПРОВЕРИТЬ ОГРАНИЧЕНИЕ [FK_Dependents_Employees_GetEmployeeDtoId] ИДТИ Модель страницы:

пространство имен WebApp.Pages.Employees { общедоступный класс DetailsModel: PageModel { частный только для чтения IEmployeeRepository _employeeRepository; [Биндпроперти] общественный GetDependentDto Dependent {get; набор; } общественный GetEmployeeDto Сотрудник {получить; набор; } public DetailsModel (IEmployeeRepository сотрудникРепозиторий) { _employeeRepository = сотрудникRepository; } общественная пустота OnGet (int id) { Сотрудник = _employeeRepository.GetById(id); } [HttpPost] public IActionResult OnPost (int id) { _employeeRepository.Add(id, Зависимый); вернуть RedirectToPage(); } } } БД — это SQL Server (localdb). База данных была создана с помощью миграции/заполнения с использованием вышеуказанных DTO.

Я следую общепринятому шаблону. Я извлекаю GetEmployeeDto из базы данных, чтобы его можно было отслеживать. Я изменяю коллекцию Dependents в отслеживаемом объекте.

Я следую рекомендациям Microsoft, но не уверен, что это правильная модель.

Сгенерированный SQL пытается ОБНОВИТЬ запись в дочерней таблице, но вместо этого он должен выполнить INSERT.

Я пробовал различные комбинации employee.Update(), employee.Dependents.Update(), получая Employee без зависимостей . Все результаты приводят к одному и тому же исключению.

Вставка дочерней записи кажется простой задачей, но я застрял на этом вопросе уже несколько дней. Любая информация приветствуется!
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»