Экземпляр типа объекта «Bot» не может быть отслежен, потому что другой экземпляр с таким же значением ключа для {'Id'} - PullRequest
0 голосов
/ 23 октября 2019

Экземпляр типа сущности 'Bot' не может быть отслежен, поскольку другой экземпляр с таким же значением ключа для {'Id'} уже отслеживается. При подключении существующих объектов убедитесь, что подключен только один экземпляр объекта с данным значением ключа. Посмотрите на нас ...

Я знаю, что означает эта проблема. Это происходит прямо здесь _context.Bots.Update(bot);.

Вопрос: это хороший способ решить эту проблему, добавив .AsNoTracking() ко всем методам GetByXXX? Есть предложения?

[HttpPut("{id}")]
public async Task<ActionResult> UpdateAsync([FromRoute] int id, [FromBody] BotCreateUpdateDto botCreateUpdateDto)
{
    if (id != botCreateUpdateDto.Id)
    {
        return BadRequest(new { Error = "Invalid ID." });
    }

    var user = await _userService.GetByEmailAsync(botCreateUpdateDto.Email);

    if (user == null)
    {
        return BadRequest(new { Error = "Invalid e-mail." });
    }

    var cryptoPair = await _cryptoPairService.GetBySymbolAsync(botCreateUpdateDto.Symbol);

    if (cryptoPair == null)
    {
        return BadRequest(new { Error = "Invalid crypto pair." });
    }

    var timeInterval = await _timeIntervalService.GetByIntervalAsync(botCreateUpdateDto.Interval);

    if (timeInterval == null)
    {
        return BadRequest(new { Error = "Invalid time interval." });
    }

    var bot = new Bot
    {
        Id = botCreateUpdateDto.Id,
        Name = botCreateUpdateDto.Name,
        Status = botCreateUpdateDto.Status,
        UserId = user.Id,
        CryptoPairId = cryptoPair.Id,
        TimeIntervalId = timeInterval.Id
    };

    bool updated;

    try
    {
        updated = await _botService.UpdateAsync(bot);
    }
    catch (Exception ex)
    {
        return BadRequest(new { Error = ex.Message });
    }

    if (updated)
    {
        return NoContent();
    }

    return NotFound();
}
public async Task<User> GetByEmailAsync(string email)
{
    return await _context.Users
        .Include(e => e.UserRoles)
            .ThenInclude(e => e.Role)
        .Include(e => e.Bots)
        .SingleOrDefaultAsync(e => e.Email == email);
}
public async Task<CryptoPair> GetBySymbolAsync(string symbol)
{
    return await _context.CryptoPairs
        .Include(e => e.Bots)
        .AsNoTracking()
        .SingleOrDefaultAsync(e => e.Symbol == symbol);
}
public async Task<TimeInterval> GetByIntervalAsync(KlineInterval interval)
{
    return await _context.TimeIntervals
        .Include(e => e.Bots)
        .AsNoTracking()
        .SingleOrDefaultAsync(e => e.Interval == interval);
}
public async Task<bool> UpdateAsync(Bot bot)
{
    _context.Bots.Update(bot);
    var updated = await _context.SaveChangesAsync();
    return updated > 0;
}

1 Ответ

1 голос
/ 23 октября 2019

Извините, я действительно не осознавал, что создаю новый объект Bot вместо того, чтобы просто получить его по id. Там также нет смысла .AsNoTracking.

var bot = await _botService.GetByIdAsync(id);
bot.Name = botCreateUpdateDto.Name;
bot.Status = botCreateUpdateDto.Status;
bot.CryptoPairId = cryptoPair.Id;
bot.TimeIntervalId = timeInterval.Id;

Это решает проблему для тех, кто имеет такую ​​же проблему, как я. Имейте в виду, что все мои сервисы доступны как DbContext. Если у вас синглтон, это также вызовет эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...