Tengo una clase POCO muy larga ("FichaCliente") que simplificaré aquí enfatizando la propiedad que es un ObservableCollection:

{
  public int FichaCliente1 { get; set; }
  ...
  public int FichaClienteN { get; set; }

  public ObservableCollection<Reclamado> Reclamados { get; set; }

  public int FichaClienteN+2 { get; set; }
  ...
  public int FichaClienteN+M { get; set; }

}

La clase "Reclamado" es también un POCO relativamente largo que tiene otra clase como elemento, la clase UF. Así podemos entender el "Reclamado" como:

{
  public int Reclamado1 { get; set; }
  ...
  public int ReclamadoN { get; set; }

  public UF Uf { get; set; }

  public int ReclamadoN+2 { get; set; }
  ...
  public int ReclamadoN+M { get; set; }

}

Siendo la clase UF un POCO simple de la siguiente manera:

{
    public int Id { get; set; }
    public string Apelido { get; set; }
    public string Descricao { get; set; }
    public string Municipio { get; set; }
}

La operación SAVE en la base de datos se maneja solo con el método "SaveFichaAsync" que es tan simple como:

public async void SaveFichaAsync(FichaCliente ficha)
    {
        using (var context = new DataContext(_dBService))
        {
            context.FichasClientes.Update(ficha);
            await context.SaveChangesAsync();

            return;
        }
    }

Lo que es seguro es que "FichaCliente" puede tener tantos "Reclamado" según se necesite. Y está bien, ¡funciona! Solo para que quede claro, la entidad UF es el equivalente a mí como lo que serían los estados en los EE. UU., Por lo tanto, una dirección determinada pertenece a un estado (ciudad, estado ...). Como los "Reclamados" son entidades distintas, puedo tener uno o más "Reclamados" pertenecientes a la misma UF.

¡Ahí es donde falla!

Si tengo la misma UF para dos o más "Reclamados" diferentes, aparece un error, como si estuviera guardando dos veces la misma UF, aunque en realidad son diferentes, cada una pertenece a un "Reclamado" diferente. No es guardar la misma UF dos veces. Guarda uno por cada "Reclamado"

Un ejemplo de error es:

"No se puede rastrear la instancia del tipo de entidad 'UF' porque ya se está rastreando otra instancia con el valor clave '{Id: 26}'. Al adjuntar entidades existentes, asegúrese de que solo se adjunte una instancia de entidad con un valor clave determinado. "

¿Cómo puedo manejar esto?

-1
Sergio Di Fiore 6 oct. 2020 a las 16:29

2 respuestas

La mejor respuesta

Aunque esto podría evitarse si desacopla el modelo de persistencia del código comercial real, para resolver eso, tendrá que iterar en todas las UF antes de SaveChangesAsync y ejecutar lo siguiente por UF

context.Entry(uf).State = EntityState.Unchanged;

2
Arley Pádua 8 oct. 2020 a las 20:47

Error de EF Core Saving para dos objetos dependiendo de un segundo igual

El método Update solo es útil cuando la entrada no está rastreada por el contexto. Más información sobre la actualización

0
Ярослав Виталиевич 6 oct. 2020 a las 14:39