Как добавить дочерние записи в родительскую сущность в 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_Employees] ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕРИРОВАН ( [Идентификатор] ASC )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) НА [ПЕРВИЧНЫЙ] TEXTIMAGE_ON [ПЕРВИЧНЫЙ] ИДТИ REATE TABLE [dbo].[Зависимые]( [Id] [int] IDENTITY(1,1) NOT NULL, [Имя] [nvarchar](макс) NULL, [Фамилия] [nvarchar](макс) NULL, [DateOfBirth] [datetime2](7) НЕ NULL, [Отношения] [int] НЕ NULL, [GetEmployeeDtoId] [int] NULL, ОГРАНИЧЕНИЕ [PK_Dependents] КЛАСТЕРИЗИРОВАННЫЙ ПЕРВИЧНЫЙ КЛЮЧ ( [Идентификатор] ASC )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) НА [ПЕРВИЧНЫЙ] TEXTIMAGE_ON [ПЕРВИЧНЫЙ] ИДТИ ALTER TABLE [dbo].[Dependents] С ПРОВЕРКОЙ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_Dependents_Employees_GetEmployeeDtoId] FOREIGN KEY([GetEmployeeDtoId]) ССЫЛКИ [dbo].[Сотрудники] ([Id]) ИДТИ ALTER TABLE [dbo].[Dependents] ПРОВЕРИТЬ ОГРАНИЧЕНИЕ [FK_Dependents_Employees_GetEmployeeDtoId] ИДТИ БД — это MSSqlServer (localdb). БД была создана с помощью миграции/заполнения с использованием вышеуказанного Dtos.

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

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

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

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

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

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

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

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

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

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