2011-10-18 7 views
0

Je vais essayer d'être aussi clair que possible:EF premier code: Modèle de configuration

Mon but: lire la configuration du modèle que je déclarais dans mon OnModelCreating dans ma substituée classe d'entité dérivée de DbContext.

Raison: Pour construire une méthode générique void Update<T>(T toUpdate) sur ma couche de données, où je reçois les champs sont la clé primaire T, permet de récupérer les sur le passé objet toUpdate et de les utiliser dans la méthode Set<T>().Find. Cela me permettrait de ne pas coder en dur la logique de recherche pour chaque type d'entité que je gère.

J'ai besoin pour récupérer l'entité stockée pour appliquer les mises à jour, comme ceci:

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

Je suis coincé au point que, dans ma _entities instance (qui est ma entités classe dérivée de DbContext bien sûr) I ne peut pas sembler trouver où la configuration du modèle est stockée.

Quelqu'un peut-il me diriger dans la bonne direction?

Merci.

Répondre

1

Vous pouvez trouver le code comment récupérer les noms de propriétés clés d'un type d'entité YourEntity ici:

Entity Framework code first. Find primary key

Et puis récupérer les valeurs:

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); 
} 

Attendez-vous que vous aurez avoir une méthode assez lente Update parce que vous devez utiliser la réflexion pour cette approche générique.

N'oubliez pas non plus que CurrentValues.SetValues ne mettra à jour que les propriétés scalaires et complexes. Cela ne vous aide pas à mettre à jour les propriétés de navigation. Vous devrez utiliser un code non générique pour mettre à jour les relations spécifiques à chaque type d'entité.

+0

C'était parfait, et j'ai déjà écrit le reste du code exactement comme vous l'avez posté. Fonctionne comme un charme. –

Questions connexes