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.

¿Fue útil?
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top