2010-01-19 6 views
10

Toutes nos tables de base de données ont UpdateUserID et UpdateTS. J'aimerais avoir cet ensemble si mon entité a des changements. Y at-il un moyen que je puisse avoir cette mise à jour sur place conditionnellement?Entity Framework: Définition de l'horodatage de mise à jour

Si je mets manuellement à jour UpdateTS dans le code, alors il dira que mon entité a changé et mettra toujours à jour l'objet.

Répondre

3

Vous devriez être en mesure de gérer l'événement SavingChanges (example here) et exécuter la logique tel que décrit par @sander

7

J'appelle cette méthode d'extension avant d'appeler context.SaveChanges():

public static void SetLastModified(this ObjectContext context, DateTime dateTime) 
{ 
    DateTime now = DateTime.UtcNow; 
    foreach (ObjectStateEntry entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) 
    { 
     if (!entry.IsRelationship) 
     { 
      IHasLastModified lastModified = entry.Entity as IHasLastModified; 
      if (lastModified != null) 
       lastModified.LastModified = now; 
     } 
    } 
} 

Je peux facilement appeler ce code, parce que j'ai emballage ObjectContext dans une classe référentiel. Si vous l'utilisez à nu, vous pouvez connecter l'événement ObjectContext.SavingChanges pour faire quelque chose de similaire.

+0

Essayer de faire la même chose comme indiqué ici, mais aux prises avec IHasLastModified. seulement obtenir une entrée nulle dans lastModified. Seriez-vous capable de publier le code que vous avez pour cette interface, ou informez-vous comment vous en faites hériter vos entités? – Martin

+1

Je m'assure que mon objet de données possède une propriété 'DateTime' appelée LastModified, puis implémente l'interface dans une classe partielle (la génération de code ne la rejette donc pas). Parce que la propriété est déjà là, il n'y a pas de code à implémenter. –

6

Voici une mise en œuvre des deux autres idées, avec les considérations suivantes

  • Assurez-vous que vous soit créez des proxies qui détectent automatiquement les modifications, soit vous avez détecté manuellement les modifications avant l'appel de SaveChanges(). Si ce n'est pas le cas, l'état de l'objet sera EntityState.Unmodified et le dernier horodatage modifié ne sera pas mis à jour.
  • J'ai développé le code pour également définir la dernière horodatage modifié lorsque l'objet est créé (EntityState.Added)

Le code

public interface IHasLastModified 
{ 
    DateTime? LastModified { get; set; } 
} 

public class MyClass : IHasLastModified 
{ 
    public virtual int Id { get; set; } 

    public virtual string SomeOtherProperty { get; set; } 

    public virtual DateTime? LastModified { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public override int SaveChanges() 
    {    
     DateTime now = DateTime.UtcNow; 
     foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)) 
     { 
      if (!entry.IsRelationship) 
      { 
       IHasLastModified lastModified = entry.Entity as IHasLastModified; 
       if (lastModified != null) 
        lastModified.LastModified = now; 
      } 
     } 

     return base.SaveChanges(); 
    } 
+0

J'utilise une solution similaire, Cependant, je dois aussi pouvoir gérer les entités proxyless (qui sont manquées par le code ci-dessus). J'ai proposé une modification de la réponse pour soutenir ceci, cependant elle a été rejetée ... – Anders

+1

@Anders: Postez juste votre propre réponse avec la modification alors. Vous pouvez faire référence à ma réponse et indiquer comment la vôtre gère correctement les entités sans limites. –

Questions connexes