¿Alguien tiene sugerencias sobre la forma más eficiente de implementar la lógica de "fila de actualización si existe otra inserción" usando Entity Framework?
c#
entity-framework
Jonathan Wood
fuente
fuente
Respuestas:
Si está trabajando con un objeto adjunto (objeto cargado desde la misma instancia del contexto) simplemente puede usar:
Si puede usar algún conocimiento sobre la clave del objeto, puede usar algo como esto:
Si no puede decidir la existencia del objeto por su Id, debe ejecutar la consulta de búsqueda:
fuente
using
bloque corto . ¿Está bien dejar el contexto en la memoria por un tiempo? Por ejemplo, durante la vida de un formulario de Windows? Normalmente intento limpiar los objetos de la base de datos para asegurar una carga mínima en la base de datos. ¿No hay problema esperando para destruir mi contexto EF?A partir de Entity Framework 4.3, hay un
AddOrUpdate
método en el espacio de nombresSystem.Data.Entity.Migrations
:que por el doc :
Para responder al comentario de @ Smashing1978 , pegaré las partes relevantes del enlace proporcionado por @Colin
Dicho esto, tengo una situación en la que estoy extrayendo datos de un servicio externo e insertando o actualizando valores existentes por clave principal (y mis datos locales para consumidores son de solo lectura), los he estado utilizando
AddOrUpdate
en producción durante más de 6 meses. Hasta ahora no hay problemas.fuente
La magia ocurre cuando se llama
SaveChanges()
y depende de la corrienteEntityState
. Si la entidad tiene unEntityState.Added
, se agregará a la base de datos, si tiene unEntityState.Modified
, se actualizará en la base de datos. Entonces puede implementar unInsertOrUpdate()
método de la siguiente manera:Más acerca de EntityState
Si no puede verificar
Id = 0
si es una entidad nueva o no, verifique la respuesta de Ladislav Mrnka .fuente
Si sabe que está utilizando el mismo contexto y no está separando ninguna entidad, puede hacer una versión genérica como esta:
db
Por supuesto, puede ser un campo de clase, o el método puede hacerse estático y una extensión, pero esto es lo básico.fuente
La respuesta de Ladislav fue cercana, pero tuve que hacer un par de modificaciones para que esto funcione en EF6 (base de datos primero). Extendí mi contexto de datos con mi método AddOrUpdate y hasta ahora parece estar funcionando bien con objetos separados:
fuente
En mi opinión, vale la pena decir que con el recientemente lanzado EntityGraphOperations para Entity Framework Code First , puede evitar escribir algunos códigos repetitivos para definir los estados de todas las entidades en el gráfico. Soy el autor de este producto. Y lo he publicado en el github , code-project ( incluye una demostración paso a paso y un proyecto de muestra está listo para descargar) y nuget .
Se ajusta automáticamente el estado de las entidades a
Added
oModified
. Y elegirá manualmente qué entidades deben eliminarse si ya no existe.El ejemplo:
Digamos que tengo un
Person
objeto.Person
podría tener muchos teléfonos, un documento y podría tener un cónyuge.Quiero determinar el estado de todas las entidades que se incluye en el gráfico.
Además, como sabe, las propiedades clave únicas podrían desempeñar un papel al definir el estado de la entidad Phone. Para tales propósitos especiales tenemos
ExtendedEntityTypeConfiguration<>
clase, que hereda deEntityTypeConfiguration<>
. Si queremos usar tales configuraciones especiales, entonces debemos heredar nuestras clases de mapeoExtendedEntityTypeConfiguration<>
, en lugar deEntityTypeConfiguration<>
. Por ejemplo:Eso es todo.
fuente
Insertar más actualizar ambos
fuente
Verifique la fila existente con Cualquiera.
fuente
Alternativa para la respuesta @LadislavMrnka. Esto si para Entity Framework 6.2.0.
Si tiene un elemento específico
DbSet
y un elemento que necesita actualizarse o crearse:Sin embargo, esto también se puede usar para un genérico
DbSet
con una sola clave primaria o una clave primaria compuesta.fuente
Corregido
fuente