Pregunta

Intentaré ser lo más claro posible:

Mi objetivo: leer la configuración del modelo que declaré en mi anulación OnModelCreating Dentro de mi clase de entidad derivada de DbContext.

Razón: construir un genérico void Update<T>(T toUpdate) Método en mi capa de datos, donde obtengo qué campos son la clave principal para T, recuperarlos en la aprobación toUpdate objeto y úselos en el Set<T>().Find método.

Esto me permitiría no codificar la lógica para cada tipo de entidad que manejo.

Necesito recuperar la entidad almacenada para aplicar actualizaciones, como esta:

var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues);
_entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate);

Estoy atrapado en el punto de que en mi _entities instancia (que es mi clase de entidades derivada de DbContext Por supuesto) parece que no puedo encontrar dónde se almacena la configuración del modelo.

¿Alguien puede señalarme en la dirección correcta?

Gracias.

¿Fue útil?

Solución

Puede encontrar el código sobre cómo recuperar los nombres clave de propiedades de un tipo de entidad YourEntity aquí:

Código de marco de entidad primero. Encuentra la clave primaria

Y luego recupere los valores:

public Update<T>(T toUpdate)
{
    // Code from link above with YourEntity = T

    List<object> myRetrievedKeyValues = new List<object>();
    foreach (var keyName in keyNames)
        myRetrievedKeyValues.Add(toUpdate.GetType().GetProperty(keyName)
            .GetValue(toUpdate, null));

    var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues.ToArray());
    _entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate);
}

Espere que tenga un bastante lento Update Método porque debe usar la reflexión para este enfoque genérico.

Tampoco olvides que CurrentValues.SetValues Solo actualizará propiedades escalares y complejas. No le ayuda a actualizar las propiedades de navegación. Tendrá que usar código no genérico para actualizar las relaciones que son específicas para cada tipo de entidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top