Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

433
Visualizações
¿Cómo usar registros de C# 9 con EF Core?

Estoy usando ASP.NET Core 5 Web API y estoy tratando de usar los nuevos registros de C# como mis clases modelo. Pero recibo un error de EF Core sobre problemas de seguimiento cada vez que actualizo mi modelo modificado usando la expresión with :

 System.InvalidOperationException: The instance of entity type 'Product' cannot be tracked because another instance with the key value '{ID: 2}' is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached.

Creo que esto se debe a que los registros "mutantes" crean una nueva instancia de objeto y al sistema de seguimiento de EF Core no le gusta eso, pero no estoy seguro de cuál es la mejor manera de solucionarlo. ¿Alguien tiene alguna recomendación? ¿O debería volver a usar clases regulares en lugar de registros?

Aquí hay un fragmento para reproducir el problema:

 // Models/Product.cs public record Product(int ID, string Name); // Controllers/ProductController.cs [HttpGet("test/{id}")] public async Task<Product> ExampleControllerAction(int id, CancellationToken cancellationToken) { string newName = "test new name!!"; Product product = await db.Products.FindAsync(new object[] { id }, cancellationToken); product = product with { Name = newName }; // Modify the model. db.Update(product); // InvalidOperationException happens here. await db.SaveChangesAsync(cancellationToken); return product; }
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Si desactiva el seguimiento de cambios de EF, debería funcionar como está escrito. Intente agregar AsNoTracking() a la llamada db original.

over 4 years ago · Santiago Trujillo Relatório

0

De documento oficial

Entity Framework Core depende de la igualdad de referencia para garantizar que usa solo una instancia de un tipo de entidad para lo que conceptualmente es una entidad. Por este motivo, los tipos de registro no son apropiados para su uso como tipos de entidad en Entity Framework Core.

Esto podría confundir a algunas personas. Presta mucha atención a la documentación. Es posible que los record no sean adecuados para entidades, pero están bien para tipos de propiedad, por ejemplo, como objetos de valor (en términos de DDD), porque dichos valores no tienen una identidad conceptual única.

Por ejemplo, si una entidad de dirección, modelada como una clase, posee un objeto de valor de ciudad, modelado como un registro, EF generalmente asignaría la ciudad como columnas dentro de la dirección como esta: City_Name , City_Code , etc. (es decir, el nombre del registro unido a un guión bajo y el nombre de la propiedad).

Tenga en cuenta que la ciudad no tiene identificación, porque aquí no estamos rastreando ciudades únicas, solo nombres y códigos y cualquier otra información que pueda agregar a una ciudad.

Hagas lo que hagas, no agregues Id a los registros e intentes mapearlos manualmente, porque dos registros con el mismo Id no significan necesariamente la misma entidad conceptual para EF, probablemente porque EF compara instancias de objetos por referencia (los registros son tipos de referencia ) y no utiliza el comparador de igualdad estándar, que es diferente para los registros que para los objetos estándar (necesita confirmación).

Yo mismo no sé muy bien cómo funciona EF en el interior para hablar con más certeza, pero confío en los documentos y probablemente también deberías confiar en ellos, a menos que quieras leer el código fuente.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda