Форум программистов, компьютерный форум, киберфорум
Web API
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/17: Рейтинг темы: голосов - 17, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 16.08.2017
Сообщений: 11

Asp Net core web API. EF Core не отслеживает изменения Entity

08.02.2021, 13:28. Показов 4000. Ответов 3

Студворк — интернет-сервис помощи студентам
Использую net core 3.1 + Entity framework core. Есть модель User и UserType, которую сохраняю в БД. К ним использую отдельные DTO для создания и чтения. В контроллер приходит Dto, маплю ее в модель юзер. Далее модель отправляю в бд, сохраняю. Потом в контроллере обратно маплю в Dto, и там Ид и юзер тип не обновленные, хотя все в базу сохранено. Отслеживание не отключал. Проблему в контроллере решил созданием новым экземпляров модели, но это неверно.

Как решить вопрос?

Модельки:

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
public class User
{
    [Key]
     public int Id { get; set; }
 
    [Required]
    [StringLength(50, MinimumLength = 5)]
    public string Nickname { get; set; }
 
    [EmailAddress]
    public string Email { get; set; }
 
    [Phone]
    public string PhoneNumber { get; set; }
 
    [Required]
    [StringLength(50, MinimumLength = 5)]
    public string Password { get; set; }
 
    public int UserTypeId { get; set; } 
 
    public virtual UserType UserType { get; set; }
} 
 
public class UserType
{
    [Key]
    public int Id { get; set; }
 
    [Required]
    [StringLength(50, MinimumLength = 5)]
    public string Name { get; set; }
}
К ним DTO для создания

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
public class UserCreateDto
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "Nickname not specified")]
    [StringLength(50, MinimumLength = 5)]
    public string Nickname { get; set; }
 
    [EmailAddress]
    public string Email { get; set; }
 
    [Phone]
    public string PhoneNumber { get; set; }
 
    [Required(AllowEmptyStrings = false, ErrorMessage = "Password not specified")]
    [StringLength(50, MinimumLength = 5)]
    public string Password { get; set; }
 
    [Required(AllowEmptyStrings = false)]
    [Compare("Password", ErrorMessage = "Passwords don't match")]
    public string PasswordConfirm { get; set; }
}
 
public class UserTypeCreateDto
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "User's type not specified")]
    [StringLength(50, MinimumLength = 3)]
    public string Name { get; set; }
}
и для чтения

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class UserReadDto
{
    public int Id { get; set; }
    public string Nickname { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
    public UserTypeReadDto UserType { get; set; }
}
 
public class UserTypeReadDto
{
    public int Id { get; set; }
    public string Name { get; set; }
}
Реализация метода в репозитории юзера. Уже тут пришлось возвращать обновленный юзер. Иначе в контроллере после вызова этого метода данные не обновлялись. Отслеживание для EF Core не отключал, метод AsNoTracking() не вызываю.

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
public async Task<User> AddAsync(User user)
{
    var context = dbContextFactory.Create(typeof(UserRepository));
 
    var userTypeId = await context.UserTypes
                                  .Where(x => x.Name == "Client")
                                  .Select(x => x.Id)
                                  .FirstOrDefaultAsync();
    if (userTypeId == 0)
    {
        UserType userType = new UserType
        {
            Name = "Client"
        };
 
        await context.UserTypes.AddAsync(userType);
        await context.SaveChangesAsync();
 
        userTypeId = userType.Id;
    }
 
    User newUser = new User
    {
        Nickname = user.Nickname,
        Email = user.Email,
        PhoneNumber = user.PhoneNumber,
        Password = user.Password,
        UserTypeId = userTypeId
    };
 
    await context.Users.AddAsync(newUser);
    await context.SaveChangesAsync();
 
    return newUser;
}
И собственно контроллер.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[HttpPost("")]
public async Task<IActionResult> CreateUserAsync(UserCreateDto userDto)
{
    if (userDto == null || !ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
 
    var user = mapper.Map<User>(userDto);
 
    //after saving to the database(context.SaveChangesAsync()), the user model is not updated.
    //I was unable to fix this.So I do the following:
    
    var userResult = await userRepository.AddAsync(user); // get user with Id from database.
 
    userResult = await userRepository.GetByIdAsync(userResult.Id); // get user with userType from 
    database.
 
    var userReadDto = mapper.Map<UserReadDto>(userResult);
 
    return CreatedAtAction(nameof(GetUserByIdAsync), new { id = userReadDto.Id }, userReadDto);
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.02.2021, 13:28
Ответы с готовыми решениями:

ASP.NET Core 3.0 с Entity Framework Core + SQL
Привет, прохожу стажировку в одной компании. Дали вот такое задание, дедлайн отсутствует, поэтому позволил себе обратиться сюда. ...

ASP.NET Core + Web API. Из контроллера обратится к web api
Добрый день. Сделал по метаниту WEB API, всё работает, но он в своём примере обращается к WEB API через Ajax запрос. А я хочу чтобы...

ASP.NET .NET Core Web Api -- почему параметры всегда null?
Что я делаю не так? using Microsoft.AspNetCore.Mvc; namespace WebApiServer.Controllers { &quot;)] public class...

3
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
08.02.2021, 18:10
Лучший ответ Сообщение было отмечено seregaone как решение

Решение

Цитата Сообщение от seregaone Посмотреть сообщение
Ид и юзер тип не обновленные, хотя все в базу сохранено
ID у вас автоинкрементируемый в базе?
Вы хотите чтоб в поле UserType был объект UserType?
Зачем вы создаете новый объект в репозитории вместо того чтобы использовать тот, что во входных параметрах? Может быть в этом проблема?
1
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
08.02.2021, 22:42
seregaone, насчет непроставленных Id сами себе противоречите.
1. user.Id используется в контроллере чтобы загрузить юзера, значит он проставлен.
2. user.UserTypeId тоже не может быть 0, потому как из AddAsync возвращается обьект у которого UserTypeId установлен вручную.

Насчет UserType так никто и не обещал что EF будет его заполнять при сохранении.
0
0 / 0 / 0
Регистрация: 16.08.2017
Сообщений: 11
09.02.2021, 19:15  [ТС]
Спасибо большое. Я действительно по какой-то глупости создавал нового юзера вместо обновления существующего. Поправил это + добавил загрузку связанных данных userType через метод .Load() и всё заработало.
Всем спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2021, 19:15
Помогаю со студенческими работами здесь

Установка Angular 2.3 на ASP .Net Core Web Api
В интернете куча примеров установки ангуляра, но старых версий. Они не подходят для установки с Ангуляром 2.3.0. Я проект на ангуляре...

Передача данных из Asp.net core web api в angular 8
1. Объясните кто нибудь пожалуйста, как передавать данные их 3 таблиц (many to many) Из asp.net core 2.2 web api application в angular 8 ...

ASP.NET Core + Web API. Как работает эта магия?
Собственно, чешу репу. Положил перед собой книгу Фримена, открыт сайт metanit, в закладках лежит харб. У всех трех источников логика подачи...

Asp Net Core Web Api + Фреймворк JS объединение связных таблиц
Добрый день! Допустим в веб приложении есть 2 таблицы: Orders и Customers. Эти две таблицы связаны, а именно в таблицу Orders заносятся...

Возможно ли развернуть ASP.NET Core Web API + React JS на виртуальном хостинге?
Сейчас у меня VPS. А возможно ли развернуть на обычном виртуальном хостинге? И будет ли это проще?


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru