Recientemente comencé a usar Entity Framework, y ha sido un poco doloroso comprobar si realmente necesito agregar nuevos registros a la base de datos o no.En Entity Framework, ¿cuál es la diferencia entre Agregar y Adjuntar y cómo puedo resolver mi problema?
Si el Entidad tengo que añadir a la base de datos ya está en ella, yo sé, porque yo hago una consulta antes de insertarlo, y si existe, entonces guardo esa instancia porque necesito usarlo en algunas relaciones.
Supongamos que el nombre de mi entidad es Book
.
El problema viene cuando la entidad no se encuentra en la base de datos, y lo hago:
Book b = //...
modelContainer.AddToBooks(b);
que fácilmente podría hacer:
modelContainer.SaveChanges()
cada vez que añadir una nueva entidad (no importa qué entidad es), y esto funcionará bien, porque como estoy insertando un tipo de entrada a la vez, y comprobando si ya está en la base de datos, no tendré problemas de duplicación.
Pero, ¿y si quiero evitar llamar a SaveChanges()
con tanta frecuencia?
En esta pregunta: Is is possible to check if an object is already attached to a data context in Entity Framework?, el autor de la pregunta proporciona un método de ese tipo de me ayuda en mi caso, pero no funciona si Add
el objeto con el contexto en lugar de Attaching
ella.
Mi pregunta (tal vez dos, pero muy relacionada) es: ¿Cuál es la diferencia entre Agregar y Adjuntar y cómo puedo resolver mi problema?
Editar:
Este es un ejemplo del problema que estoy teniendo.
Tengo una entidad Result
que tiene una relación con dos entidades más: Trainer
y Horse
.
Obtengo los datos de una fuente externa, así que tengo que crear manualmente todas las entidades.
Cada vez que necesita para insertar una nueva Trainer
, que hago:
var trainer = Trainer.CreateTrainer(Id)
Entonces consultar la base para ver si un entrenador con el que Id
ya está en la base de datos. Si es así, entonces reemplazo la variable trainer
con la que está en la base de datos.
Si no es así, no puedo hacer dos cosas aquí:
- Acople el entrenador para el contexto (puedo comprobar si ya existe el uso de la clave)
- Añadir al entrenador al contexto (usando
AddToTrainers(...)
)
El mismo proceso para Horse
.
Ahora, cuando tengo que crear una nueva Result
(que contiene un Trainer
y una Horse
), asigno el caballo anterior entrenador & a esa instancia resultado.
¿Qué debo hacer aquí para poder agregar al contexto el nuevo Result
?
- Si hay que adjuntar el entrenador/caballo, entonces cuando hay que adjuntar el resultado, me sale
InvalidOperationException
, me teling que el entrenador ya está en el contexto del objeto. - Si agrego el capacitador en lugar de adjuntarlo, aparece otro error (no puedo recordarlo ahora, pero me decía que un Entrenador ya estaba en la base de datos).
Importante:
El primer error se da cuando se fija el resultado, y el segundo cuando se hace SaveChanges()
.
Lo que quiero evitar aquí es llamar al SaveChanges()
cada vez que agrego un resultado nuevo.
@Ladislav Gracias por su respuesta. De acuerdo con mi problema, ¿cómo puedo evitar insertar una instancia de una entidad 'A' con una relación con una instancia de' B', cuando ya agregué/adjunté la instancia de 'B'? Solo quiero insertar la instancia de 'A', pero obtengo' InvalidOperationException' –
Agregue un ejemplo a su pregunta. –
@Ladislav Agregado. –