Determinar eficientemente si EF 4 POCO ya está en ObjectSet
-
24-10-2019 - |
Pregunta
Estoy probando EF 4 con Poco en un pequeño proyecto por primera vez. En mi implementación de repositorio, quiero proporcionar un método AddorUpdate que agregará un POCO aprobado al repositorio si es nuevo, de lo contrario no hacer nada (ya que el POCO actualizado se guardará cuando se llame a SaveChanges).
Mi primer pensamiento fue hacer esto:
public void AddOrUpdate(Poco p)
{
if (!Ctx.Pocos.Contains<Poco>(p))
{
Ctx.Pocos.AddObject(p);
}
}
Sin embargo, eso da como resultado un NotSupportedException
Como se documenta en Referencia a variables no escalares no compatibles (Pregunta adicional: ¿Por qué no sería compatible?)
Solo quitando el Contains
Parte y siempre llaman a los resultados de addobject en un InvalidStateException
:
Ya existe un objeto con la misma clave en ObjectStatEraMer. El objeto existente está en el estado sin cambios. Un objeto solo se puede agregar nuevamente al ObjectStateManager si está en el estado agregado.
Claramente, EF 4 sabe en algún lugar que este es un duplicado basado en la clave.
¿Cuál es una forma limpia y eficiente para que el repositorio actualice POCOS para un objeto nuevo o preexistente cuando se llama a AddorUpdate para que la llamada posterior a SaveChanges () haga lo correcto?
Consideré llevar una bandera ISNEW en el objeto en sí, pero estoy tratando de ignorar la persistencia en cuanto a práctico.
Solución
Intenta mirar ObjectStatemanager.tryGetObjectStateEntry Método, es bueno descrito en Este Queston de Stackoverflow.