Ошибка параллелизма в .NET с SQL Server и Entity FrameworkC#

Место общения программистов C#
Ответить
Anonymous
 Ошибка параллелизма в .NET с SQL Server и Entity Framework

Сообщение Anonymous »

У меня возникла ошибка параллелизма при попытке обновить объект Advert. Я делаю что-то не так?
Контекст: каждое объявление должно содержать одну или несколько фотографий. И моя логика такая: когда фронт присылает новые изображения, я удаляю старые и добавляю новые.
Я делаю что-то не так?
Вот мой код:
public async Task Update(AdvertUpdateDto advertUpdateDto, Guid id)
{
var response = new ResponseModel();

try
{
var advert = await _context.Adverts
.Include(a => a.Opcionais)
.Include(a => a.Imagens)
.Include(a => a.Usuario)
.FirstOrDefaultAsync(a => a.Id == id);

if (advert == null)
{
response.Mensagem = "Anúncio não encontrado";
return response;
}

var optionals = await _context.Optionals
.Where(opt => advertUpdateDto.Opcionais.Contains(opt.Id))
.ToListAsync();

if (optionals.Count != advertUpdateDto.Opcionais.Count)
{
throw new ArgumentException("Um ou mais opcionais fornecidos não são válidos.");
}

// Atualiza propriedades básicas do anúncio
advert.Cor = advertUpdateDto.Cor;
advert.Cep = advertUpdateDto.Cep;
advert.Cidade = advertUpdateDto.Cidade;
advert.Estado = advertUpdateDto.Estado;
advert.Preco = advertUpdateDto.Preco;
advert.Portas = advertUpdateDto.Portas;
advert.Quilometragem = advertUpdateDto.Quilometragem;
advert.Descricao = advertUpdateDto.Descricao;
advert.Cambio = advertUpdateDto.Cambio;
advert.Opcionais = optionals;

// Adicionar novas fotos
var newPhotos = advertUpdateDto.Imagens.Select(img => new Photo(img.Url, img.Chave)).ToList();
advert.Imagens = newPhotos;

// Salva as alterações no banco de dados
await _context.SaveChangesAsync();

var result = new AdvertDto
{
AnoModelo = advert.AnoModelo,
Cambio = advert.Cambio,
Condicao = advert.Condicao,
Cidade = advert.Cidade,
Cep = advert.Cep,
Cor = advert.Cor,
DataAtualizacao = advert.DataAtualizacao,
DataCricao = advert.DataCricao,
Descricao = advert.Descricao,
Destaque = advert.Destaque,
Estado = advert.Estado,
Id = advert.Id,
Marca = advert.Marca,
Placa = advert.Placa,
Modelo = advert.Modelo,
Portas = advert.Portas,
Preco = advert.Preco,
Tipo = advert.Tipo,
Quilometragem = advert.Quilometragem,
Slug = advert.Slug,
Opcionais = advert.Opcionais.Select(opt => new OptionalDto { Name = opt.Nome }).ToList(),
Imagens = advert.Imagens.Select(img => new PhotoDto { Chave = img.Chave, Url = img.Url }).ToList(),
Usuario = new AdvertUserDto
{
Id = advert.Usuario.Id,
Nome = advert.Usuario.Nome,
Email = advert.Usuario.Email,
Imagem = advert.Usuario.Imagem,
Sobrenome = advert.Usuario.Sobrenome,
Telefone = advert.Usuario.Telefone
},
UsuarioId = advert.UsuarioId
};
response.Dados = result;
}
catch (DbUpdateConcurrencyException ex)
{
Console.WriteLine(ex.ToString());
response.Mensagem = "Concurrency error";
}
catch (Exception)
{
response.Mensagem = "Advert Update error";
}

return response;
}

public sealed class Advert
{
[Key] public Guid Id { get; set; }
public string Tipo { get; set; }
public string Marca { get; set; }
public string Modelo { get; set; }
public int AnoModelo { get; set; }
public string Cor { get; set; }
public string Cep { get; set; }
public string Cidade { get; set; }
public string Estado { get; set; }
public int Preco { get; set; }
public string Portas { get; set; }
public int Quilometragem { get; set; }
public string Descricao { get; set; }
public string Placa { get; set; }
public string Cambio { get; set; }

[DataType(DataType.DateTime)]
public DateTime DataCricao { get; set; } = DateTime.UtcNow;
[DataType(DataType.DateTime)]
public DateTime? DataAtualizacao { get; set; }

public Condition Condicao { get; set; } = Condition.REQUESTED;
public string Slug { get; set; }
public bool? Destaque { get; set; }
public Guid? UsuarioId { get; set; }
public User Usuario { get; set; }

public List? Imagens { get; set; }
public List? Opcionais { get; set; }

[ConcurrencyCheck]
public Guid Version { get; set; }

private Advert() {}

public Advert(string tipo, string marca, string modelo, int anoModelo, string cor, string cep,
string cidade, string estado, int preco, string portas, int quilometragem, string descricao, string placa,
string cambio, DateTime dataAtualizacao, Condition condicao, string slug, bool? destaque, Guid? usuarioId,
User usuario,
List? imagens, List? opcionais)
{
Id = Guid.NewGuid();
Tipo = tipo;
Marca = marca;
Modelo = modelo;
AnoModelo = anoModelo;
Cor = cor;
Cep = cep;
Cidade = cidade;
Estado = estado;
Preco = preco;
Portas = portas;
Quilometragem = quilometragem;
Descricao = descricao;
Placa = placa;
Cambio = cambio;
DataAtualizacao = dataAtualizacao;
Condicao = condicao;
Slug = slug;
Destaque = destaque;
UsuarioId = usuarioId;
Usuario = usuario;
Imagens = imagens;
Opcionais = opcionais;
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... -framework
Ответить

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

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

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

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

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