Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

432
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!