Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 405

Невозможно выполнить Update т.к. объект уже отслеживается

11.02.2025, 16:34. Показов 1742. Ответов 24

Студворк — интернет-сервис помощи студентам
Пытаюсь обновить объект в бд, в запросе HttpPut, но получаю такое исключение:
Code
1
The instance of entity type 'Container' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.
В контроллере:
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
[HttpPut("{id}")]
public async Task<IActionResult> UpdateContainer(int id, [FromBody] Container container) 
{
    try 
    {
        if (container == null)
        {
            _logger.LogError("Объект container равен null");
            return BadRequest("Объект container равен null");
        }
        if (!ModelState.IsValid)
        {
            _logger.LogError("Недопустимый объект container, отправленный от клиента.");
            return BadRequest("Недопустимый объект container");
        }
        var dbcontainer = await _repositoryManager.Container.GetContainerAsync(id, true);
        if (dbcontainer == null)
        {
            _logger.LogError($"Container c id: {id}, не был найден в базе данных.");
            return NotFound();
        }
        await _repositoryManager.Container.UpdateContainerAsync(dbcontainer, container);
        return NoContent();
    }
    catch (Exception ex)
    {
        _logger.LogError($"Что-то пошло не так внутри операции UpdateContainer: {ex.Message}");
        return StatusCode(500, "Внутренняя ошибка сервера");
    }
}
В репозитории:
C#
1
2
3
4
5
6
public async Task UpdateContainerAsync(Container dbContainer, Container container)
{
    dbContainer = _mapper.Map<Container>(container);
    Update(dbContainer);
    await Save();
}
В RepositoryBase:
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
public class RepositoryBase<T> : IRepositoryBase<T> where T : class
{
    protected BwwstorageContext _applicationContext;
    public RepositoryBase(BwwstorageContext bwwstorageContext)
    {
        _applicationContext = bwwstorageContext;
    }
 
    public IQueryable<T> FindAll(bool trackChanges) =>
        !trackChanges ?
            _applicationContext.Set<T>()
            .AsNoTracking() :
            _applicationContext.Set<T>();
 
    public IQueryable<T> FindByCondition(Expression<Func<T, bool>> expression, bool trackChanges) =>
        !trackChanges ?
            _applicationContext.Set<T>()
            .Where(expression)
            .AsNoTracking() :
            _applicationContext.Set<T>()
            .Where(expression);
 
    public void Create(T entity) => _applicationContext.Set<T>().Add(entity);
 
    public void Update(T entity) => _applicationContext.Set<T>().Update(entity);
 
    public void Delete(T entity) => _applicationContext.Set<T>().Remove(entity);
 
    public async Task Save() => await _applicationContext.SaveChangesAsync();
}
Пока решил тем, что отключил AsNoTracking() в GetContainerAsync(), но мне кажется, что это какой-то косяк и так не должно быть. При этом в Delete запросе почти то же самое и Tracking включен, а работает без исключений:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteContainer(int id) 
{
    try 
    {
        var container = await _repositoryManager.Container.GetContainerAsync(id, true);
        if (container == null)
        {
            _logger.LogError($"Container c id: {id}, не был найден в базе данных.");
            return NotFound();
        }
        await _repositoryManager.Container.DeleteContainerAsync(container);
        return NoContent();
    }
    catch (Exception ex)
    {
        _logger.LogError($"Что-то пошло не так внутри операции DeleteContainer: {ex.Message}");
        return StatusCode(500, "Внутренняя ошибка сервера");
    }
}
Подскажите может я не правильно как-то делаю Put запрос?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2025, 16:34
Ответы с готовыми решениями:

Добавить в уже существующий объект свойство и положить в него объект
У меня имеется такая вложенность в редьюсере initialState = { prop1: { props2: { prop3: {id:...

CodeFirst EF Многие-ко-Многим невозможно сделать Update
Всем доброго времени суток! Существует следующая модель, для которой создается БД с помощью Code-First. public class...

Не работает UPDATE -уже замучался
Уже нет сил....нет эмоций...нет воли к победе ....Ладно ;) Ну на самом деле ХЗ в чем дело, замучался. Никаких ошибок , все нормально, но в...

24
 Аватар для Andrey-MSK
3187 / 2081 / 378
Регистрация: 14.08.2018
Сообщений: 6,920
Записей в блоге: 4
11.02.2025, 16:52
Цитата Сообщение от firnen_dragon Посмотреть сообщение
Code
1
Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.
А вот это что показывает? Что там конфликтует?
0
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 405
11.02.2025, 17:30  [ТС]
Andrey-MSK, подключил EnableSensitiveDataLogging вот так:
C#
1
2
3
4
5
6
services.AddDbContextPool<BwwstorageContext>(op => { op.UseMySql(connetionString, ServerVersion.AutoDetect(connetionString)); op.EnableSensitiveDataLogging(true); })
.AddLogging(loggingBuilder => {
    loggingBuilder.AddConsole()
        .AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Information);
    loggingBuilder.AddDebug();
});
в логах:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Microsoft.EntityFrameworkCore.Database.Command: Information: Executed DbCommand (3ms) [Parameters=[@__id_0='19834'], CommandType='Text', CommandTimeout='30']
SELECT `c`.`id`, `c`.`cell_id`, `c`.`count`, `c`.`date_added`, `c`.`date_expired`, `c`.`description`, `c`.`element_id`, `c`.`is_active`, `c`.`is_defected`, `c`.`is_reserved`, `c`.`is_virtual`, `c`.`name`, `c`.`operation_id`, `c`.`parent_id`
FROM `container` AS `c`
WHERE `c`.`id` = @__id_0
LIMIT 1
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (3ms) [Parameters=[@__id_0='19834'], CommandType='Text', CommandTimeout='30']
      SELECT `c`.`id`, `c`.`cell_id`, `c`.`count`, `c`.`date_added`, `c`.`date_expired`, `c`.`description`, `c`.`element_id`, `c`.`is_active`, `c`.`is_defected`, `c`.`is_reserved`, `c`.`is_virtual`, `c`.`name`, `c`.`operation_id`, `c`.`parent_id`
      FROM `container` AS `c`
      WHERE `c`.`id` = @__id_0
      LIMIT 1
Вызвано исключение: "System.InvalidOperationException" в Microsoft.EntityFrameworkCore.dll
Вызвано исключение: "System.InvalidOperationException" в System.Private.CoreLib.dll
fail: StorageWebAPI.Controllers.ContainerController[0]
StorageWebAPI.Controllers.ContainerController: Error: Что-то пошло не так внутри операции UpdateContainer: The instance of entity type 'Container' cannot be tracked because another instance with the key value '{Id: 19834}' is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached.
      Что-то пошло не так внутри операции UpdateContainer: The instance of entity type 'Container' cannot be tracked because another instance with the key value '{Id: 19834}' is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached.
0
Эксперт .NET
 Аватар для Wolfdp
2667 / 1619 / 354
Регистрация: 15.06.2012
Сообщений: 5,973
Записей в блоге: 3
11.02.2025, 17:51
Лучший ответ Сообщение было отмечено firnen_dragon как решение

Решение

Дык, метод Map создает новый объект. Вы вычитали в dbContainer с настройкой "отслеживать", создали ещё один с таким же ID и пытаетесь запихнуть в контекст. Если используете автомапер, там вроде есть возможность указывать на какой объект применять мапинг, а не создавать новый.
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 405
12.02.2025, 12:12  [ТС]
Wolfdp, блин чего-то я не догоняю как именно копировать в этом автомапере, везде написано что это будет копировать данные:
C#
1
_mapper.Map(container, dbContainer);
но по итогу вообще ничего не происходит, 10 раз их местами переставлял, 0 толку
профиль:
C#
1
2
3
4
5
6
7
8
public class AutoMapperProfile : Profile
{
    public void ConfigureMapping()
    {
        CreateMap<Container, Container>();
        // Дополнительные мэпинги по необходимости
    }
}
Сервис:
C#
1
services.AddAutoMapper(typeof(AutoMapperProfile))
Добавлено через 1 минуту
Т.е. в дебаге я вижу что мне приходит объект с полем 10, но в бдшный объект поле не копируется почему-то
0
Эксперт .NET
 Аватар для Wolfdp
2667 / 1619 / 354
Регистрация: 15.06.2012
Сообщений: 5,973
Записей в блоге: 3
12.02.2025, 12:46
Покажите обе ваши модели. Скорее всего автомапинг не разруливает автоматически по названию и нужно прописать в профиле.
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 405
12.02.2025, 12:59  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Покажите обе ваши модели.
Модель одна:
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
public partial class Container
{
    public int Id { get; set; }
 
    public int? Name { get; set; }
 
    public int ElementId { get; set; }
 
    public int Count { get; set; }
 
    public DateOnly? DateExpired { get; set; }
 
    public int? ParentId { get; set; }
 
    public int? CellId { get; set; }
 
    public int? OperationId { get; set; }
 
    public string? Description { get; set; }
 
    public sbyte IsReserved { get; set; }
 
    public sbyte IsDefected { get; set; }
 
    public sbyte IsActive { get; set; }
 
    public sbyte IsVirtual { get; set; }
 
    public DateTime? DateAdded { get; set; }
 
    [JsonIgnore]
    public virtual Cell? Cell { get; set; }
    [JsonIgnore]
    public virtual Element? Element { get; set; } = null!;
    [JsonIgnore]
    public virtual ICollection<Container> InverseParent { get; set; } = new List<Container>();
    [JsonIgnore]
    public virtual ElementOperation? Operation { get; set; }
    [JsonIgnore]
    public virtual Container? Parent { get; set; }
}
Самое интересное то что я объявил мапер прям в репозитории и он нормлаьно все копирует, видимо что-то не так с настройкой сервиса:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public async Task UpdateContainerAsync(Container dbContainer, Container container)
{
    MapperConfiguration config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<Container, Container>();
    });
 
    IMapper mapper = config.CreateMapper();
 
 
    mapper.Map(container, dbContainer);
    Update(dbContainer);
    await Save();
}
0
Эксперт .NET
 Аватар для Wolfdp
2667 / 1619 / 354
Регистрация: 15.06.2012
Сообщений: 5,973
Записей в блоге: 3
12.02.2025, 13:07
Цитата Сообщение от firnen_dragon Посмотреть сообщение
Модель одна
Не обратил внимания. Тут не подскажу, надо копать.

Единственное что отмечу -- такой подход плохой. Если нет четкой модели, которая явно ограничивает изменяемые поля, то появляються такие проблемы:
- в запросе не прилетают все поля и заменяются на default, хотя они должны были остаться неизменные
- проблемы безопасности, когда юзер инжектит изменения туда, куда не нужно
0
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 405
12.02.2025, 13:18  [ТС]
Wolfdp, А что значит четкая модель? У меня просто db first, эту модель ef core автоматом сгенерировал я там только игноры добавил
0
Эксперт .NET
 Аватар для Wolfdp
2667 / 1619 / 354
Регистрация: 15.06.2012
Сообщений: 5,973
Записей в блоге: 3
12.02.2025, 13:22
Цитата Сообщение от firnen_dragon Посмотреть сообщение
А что значит четкая модель?
Ваш http метод UpdateContainer должен принимать не dto, а собственную. А уже для них писать мапинг. Крайне муторная работа, но зато обеспечивает четкий контроль происходящего
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 405
12.02.2025, 13:26  [ТС]
Wolfdp, Понял, спасибо
0
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 405
13.02.2025, 12:12  [ТС]
Wolfdp, Подскажите еще такой момент, на сколько адекватно использовать мапер в репозитории? просто судя по инфе в интернетах мапер это не уровень репозитория, а уровень сервисов и контроллеров, но на мой взглдя это не очень удобно, если его прокинуть в репозиторий, то там его использовать куда комфортнее и это позволяет инкапсулировать еще одну строку в контроллере в котором у меня и так дофига кода.
0
Эксперт .NET
 Аватар для Wolfdp
2667 / 1619 / 354
Регистрация: 15.06.2012
Сообщений: 5,973
Записей в блоге: 3
13.02.2025, 12:46
Ну смотрите:
- модель приходящая на endpoint -- уровень web api
- мапер должен знать про эту модель
- мапер должен знать про модель репозитория
- в классическом подходе репозиторий ничего не должен знать про web api

Если вы пропихиваете это в репозиторий, значит у вас инверсия зависимостей (такой подход тоже практикуют, но не часто). Грубо говоря ваш верхний уровень определяет контракт, а нижний должен его реализовывать. Если репозиторий вынести в отдельную либу, то:
- классический подход поразумевает что web api будет ссылаться на репозиторй
- инверсия -- репозиторий ссылается на web api.

Я бы следовал классическому подходу, т.к. обычно гораздо легче определять логику хранения и где-то выше использовать, чем задавать правила выше и реализовывать.

P.S. если у вас прям горит задача -- запихните чтобы работало и добавьте TODO + тикет на рефакторинг. Потом выделите время и приведете в порядок.

Если нет -- лучше разобраться почему мапер не работает.
2
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 405
13.02.2025, 12:51  [ТС]
Wolfdp, Спасибо, c мапером я разобрался проблема была в кривых руках(не правильно создал профиль)
C#
1
2
3
4
5
6
7
8
9
public class AutoMapperProfile : Profile
{
    public AutoMapperProfile()
    {
        CreateMap<ContainerDto, Container>();
        CreateMap<Container, ContainerDto>();
        // Дополнительные мэпинги по необходимости
    }
}
0
 Аватар для Calabonga
10 / 10 / 0
Регистрация: 13.02.2025
Сообщений: 19
13.02.2025, 14:17
Цитата Сообщение от firnen_dragon Посмотреть сообщение
Подскажите еще такой момент, на сколько адекватно использовать мапер в репозитории?
Для начала - маппер в репозитории очень плохо, и в "интернетах" пишут правду. Но также в "интернетах" пишут, что лучше вообще отказаться от маппера, тем более, что ваша модель не такая сложная.
0
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 405
13.02.2025, 14:25  [ТС]
Цитата Сообщение от Calabonga Посмотреть сообщение
лучше вообще отказаться от маппера
А как тогда копировать данные? Руками их присваивать?

Добавлено через 29 секунд
Это ж ваще на 100 лет работы особенно если бд большая
0
Эксперт .NET
 Аватар для Wolfdp
2667 / 1619 / 354
Регистрация: 15.06.2012
Сообщений: 5,973
Записей в блоге: 3
13.02.2025, 14:28

Не по теме:

Цитата Сообщение от Calabonga Посмотреть сообщение
Для начала - маппер в репозитории очень плохо, и в "интернетах" пишут правду.
Год назад я бы также сказал, т.к. в голове была только одна конструкция "верхний уровень всегда зависит от нижних". Строго говоря это не всегда так: есть задачи, когда лучше применять инверсию зависимостей.



Добавлено через 3 минуты
Цитата Сообщение от firnen_dragon Посмотреть сообщение
А как тогда копировать данные? Руками их присваивать?
Там сложный и дискуссионный вопрос. Грубо говоря автомапер -- задержка. Плюс писать дополнительные модели -- муторно. Но в тоже время у вас единая точка контроля, и гибкая логика под изменения. Короче: серебряной пули нет.

Если уже используете, я не вижу особого смысла перелопачивать архитектуру.
1
 Аватар для Calabonga
10 / 10 / 0
Регистрация: 13.02.2025
Сообщений: 19
13.02.2025, 14:29
Цитата Сообщение от firnen_dragon Посмотреть сообщение
А как тогда копировать данные
1. Мапперы бывают разные, быстрые и не очень.
2. Если вам нужно в один момент времени "копировать" такой объем данных, что с ним справится только маппер - значит нужно пересмотреть архитектуру.
3. Самая большая проблема маппера, что к нему быстро привыкаешь, а потом в нем начинает "плодиться" логика.
4. Копирование БД при помощи маппера? Серьезно? Это как?
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 405
13.02.2025, 14:47  [ТС]
Цитата Сообщение от Calabonga Посмотреть сообщение
Копирование БД при помощи маппера? Серьезно? Это как?
Ну я имел ввиду не копирование бд само собой, а то что если у меня много таблиц разных в бд под них есть свои модели и их много,а вместо того чтоб прописать одну строчку в профиле мапера и одну строчку в контроллере мне надо будет каждый раз делать что-то типо этого, только с большим кол-вом полей
C#
1
2
3
4
5
6
7
8
9
var municipoToReturn = await _context.Municipios
    .Select(m => new MunicipioDto
    {
        Id = m.Id,
        Nombre = m.Nombre,
        EstadoId = m.EstadoId,
        Estado = m.Estado.Nombre
    })
    .FirstOrDefaultAsync(m => m.Id == municipo.Id);
0
 Аватар для Calabonga
10 / 10 / 0
Регистрация: 13.02.2025
Сообщений: 19
13.02.2025, 15:03
Цитата Сообщение от firnen_dragon Посмотреть сообщение
а вместо того чтоб прописать одну строчку в профиле мапера
Да, именно так и придется сделать, но можно же сделать один раз, также как и с маппером, а потому просто использовать.

Например, так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// типа МАР
public static class CategoryExpressions
{
    public static Expression<Func<Category, CategoryViewModel>> Default => s => new CategoryViewModel
    {
        Name = s.Name,
        Id = s.Id,
        IsPublished = s.IsPublished,
        Description = s.Description,
        ItemsCount = s.Posts!.Count,
        Route = s.Route
    };
}
 
// Использование:
var entity = await _unitOfWork.GetRepository<Category>().GetFirstOrDefaultAsync(
            selector: CategoryExpressions.Default,
            predicate: x => x.Id == request.Id,
            trackingType: TrackingType.NoTracking);
Я когда-то тоже был поклонником, причем яростным, мапперов и маппинга. Безусловно, они существенно ускоряют разработку. Но есть и "минусы". Видимо, вы с ними еще не сталкивались, а значит мы говорим просто о "вкусовщине".

Если на ваш взгляд без маппера никак, то так тому и быть
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2025, 15:03
Помогаю со студенческими работами здесь

Не срабатывает UPDATE к уже имеющемуся значению
Добрый день уважаемые гуру! Подскажите пожалуйста, как заставить запрос добавить новые данные к имеющемуся значению? Почему не...

update.... в поиске не нашел... а решить уже не в состоянии
Проблема... строчка на PHP mysql_query(&quot;update messages set sperre=&quot;.$r_sperre.&quot; where ID=1&quot;) or die(mysql_error()); В налонично ...

Update, если ячейка уже есть в базе
Здравствуйте! Работаю с MS SQL, на данный момент разобрался как переносить в базу из экселя без прописывания циклов. Однако, код...

Невозможно создать файл так как он уже существует
Здравствуйте. Не пойму что ему нужно, вроде все правильно: Program Lol; Uses CRT; var f,t:text; st:string; ...

Невозможно создать рзадел или испоьзовать уже существующий
Доброго времени суток, уважаемые форумчане! Всех со старым новым годом. У меня при установке виндос 8 возникла следующая проблема : у меня...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Размещения без повторений
VistaSV30 31.05.2025
Код возвращает список вариантов размещений A^{k}_{n}=\frac{n!}{(n-k)!} from itertools import permutations def pwr(k, n): # Размещение без повторений (Placement without repetition) if k. . .
Redis и Node.js с TypeScript - решения для высоконагруженных систем
Reangularity 31.05.2025
Redis (Remote Dictionary Server) — сверхбыстрое хранилище данных в памяти, способное обрабатывать операции за микросекунды. И что особенно важно для нас — с удивительно простым API. А теперь. . .
Unit-тестирование с моками в Go
golander 31.05.2025
Большинство разработчиков предпочитают тестировать код без использования моков. Например, при интеграции с Elasticsearch логичнее запустить контейнер локально и тестировать Go-код непосредственно с. . .
Как работать с PDF в C#
stackOverflow 31.05.2025
Нам приходится сталкиваться с PDF по разным причинам. Генерация счетов, создание отчетов, извлечение данных из загруженных пользователем документов, автоматизация рабочих процесов - это лишь верхушка. . .
Двухбуквенные коды стран в шифровании.
russiannick 31.05.2025
Человечество издревле манила возможность замены сочетаний букв вымышленными символами, делающие сообщение понятным только для посвещенных. Настала пора внести в это свой вклад. Двухбуквенные коды. . .
Мой опыт в исправлении ошибки приложения Boinc в части заряда батареи смартфона.
Programma_Boinc 31.05.2025
Мой опыт в исправлении ошибки приложения Boinc в части заряда батареи смартфона. Хотел бы поделиться опытом в исправлении ошибки приложения в части заряда батареи смартфона. Сразу скажу, что. . .
Добро пожаловать на конкурс PrimeGrid, посвященный 20-летию PrimeGrid
Programma_Boinc 31.05.2025
Добро пожаловать на конкурс PrimeGrid, посвященный 20-летию PrimeGrid: 5-дневный обобщенный поиск простых чисел Ферма n = 20 с 12 июня 20:20 UTC по 17 июня 20:20 UTC. 12 июня 2005 года. . .
Вероятность в шансы / Шансы в вероятность
VistaSV30 31.05.2025
# Шансы -> Вероятность def Chance_to_Probability(ch): def gcd(a, b): # НОД - нужен для упрощения значений шансов while b != 0: a, b = b, a % b return a. . .
FastAPI и Flask: Отличия, производительность и примеры использования
py-thonny 30.05.2025
Если вы разрабатываете веб-приложения на Python, вы наверняка слышали о Flask и FastAPI. Эти два фреймворка часто становятся предметом жарких дискуссий в сообществе разработчиков. И не без основания. . .
ML.NET и TensorFlow.NET: Умные приложения на C# с машинным обучением
stackOverflow 30.05.2025
Еще совсем недавно, когда речь заходила о машинном обучении, C# разработчики обреченно вздыхали и тянулись к Python. Мир искуственного интеллекта словно был огражден невидимым забором с табличкой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »