2011-06-21 5 views
0

J'utilise Entity Framework 4.1 avec une approche de code d'abord sur un site ASP.NET MVCEntity Framework 4.1 (premier code) colonne audit

Dire que j'ai une entité nommée Profil qui garde la trace d'un le livre préféré de l'utilisateur, et je veux suivre quand l'utilisateur met à jour son livre préféré.

MISE À JOUR:

Je veux Utilisation de la classe ci-dessous à titre d'exemple, pour définir la propriété FavoriteBookLastUpdated à la date actuelle chaque fois que la valeur de la propriété change FavoriteBook.

public class Profile 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string FavoriteBook { get; set; } 
    public DateTime? FavoriteBookLastUpdated { get; set; } 
} 

En ce moment, je mets à jour tout ce domaine, le cas échéant, dans l'action Edit du contrôleur avant d'appeler la méthode de SaveChanges de DBContext().

Y a-t-il un moyen de mettre cette logique dans mon modèle d'une manière ou d'une autre? Je préfère ne pas utiliser de déclencheurs du côté de la base de données.

+0

À quoi serviraient les déclencheurs? –

+0

@Per Hornshøj-Schierbeck, en utilisant un déclencheur SQL UPDATE, j'ai pu vérifier que la colonne FavoriteBook est sur le point de changer, et estampiller l'heure actuelle dans la colonne FavoriteBookLastUpdated. C'est exactement ce que je voudrais faire, mais dans le code à la place. –

Répondre

2

EDIT: J'ai lu votre commentaire et nouvel exemple :)

Pourriez-vous pas avoir votre propriété de livres préférés être une propriété réelle qui définit également LastModified? Je ne suis pas sûr si EF4 acceptera cela, mais alors vous pourriez faire une propriété publique pour changer le FavoriteBook et un spécial pour EF4 seulement. Vous pourriez avoir besoin de rendre la propriété spéciale « InternalsVisibleTo »

http://msdn.microsoft.com/en-us/library/0tke9fxk(v=vs.80).aspx

+0

+1 Oui. Si vous voulez modifier une autre propriété avec un changement en cours, cela ressemble à un cas où le créateur de propriétés personnalisées fait tout. Cela n'a rien à voir avec EF. –

+0

@Ladislav, parfait. J'aurais dû essayer ça dès le début. Je pensais trop ça. J'ai créé un setter de propriété publique personnalisé (et getter) pour FavoriteBook qui met également à jour la propriété lastupdated. Simple. –

3

Si vous ne l'aimez pas la réponse du @Per Hornshøj-Schierbeck que je pense est correct, vous pouvez essayer d'utiliser EF pour que:

public override int SaveChanges() 
{ 
    foreach (var entry in ChangeTracker.Entries<Profile>()) 
    { 
     if (entry.OriginalValues == null || // I'm not sure what value this have if entity is not loaded 
      entry.Entity.FavoritBook != entry.OriginalValues["FavoriteBook"].ToString()) 
     { 
      entry.Entity.FavoriteBookLastUpdated = DateTime.Now; 
     } 
    } 

    return base.SaveChanges(); 
} 
Questions connexes