Question

entités de suivi auto. Impressionnant.

Sauf quand vous faites quelque chose comme

return Db.Users;

aucune des entités autovirants sont suivi (jusqu'à ce que, peut-être, ils sont désérialisé).

Fin

. Nous devons donc reconnaître qu'il existe une possibilité qu'une entité de revenir à nous n'a pas activé le suivi.

Maintenant que ???

Ce que j'ai essayé

Pour le corps de la méthode donnée:

using (var db = new Database())
{
    if (update.ChangeTracker.ChangeTrackingEnabled)
        db.Configurations.ApplyChanges(update);
    else
        FigureItOut(update, db);

    db.SaveChanges();
    update.AcceptChanges();
}

Les implémentations de FigureItOut suivantes tous échouent:

db.Configurations.Attach(update);
db.DetectChanges();

Ni

db.Configurations.Attach(update);
db.Configurations.ApplyCurrentValues(update);

Ni

db.Configurations.Attach(update);
db.Configurations.ApplyOriginalValues(update);

Ni

db.Configurations.Attach(update);
db.Configurations.ApplyChanges(update

ne de rien d'autre que je peux comprendre à jeter à elle, autre que

  1. Obtenir l'entité d'origine de la base de données
  2. En comparant chaque propriété à la main
  3. Mise à jour de propriétés au besoin

Qu'est-ce, exactement, suis-je censé faire avec des entités autovirants qui ne sont pas eux-mêmes le suivi ??


Petite mise à jour:

marque Aveuglément l'entité travaux modifiés, mais cela semble un peu mauvais. Est-ce le meilleur que nous pouvons faire dans ce cas?

Était-ce utile?

La solution

scénario 1

Voici quelques pratiques recommandées à suivre. Lorsque vous utilisez STE dans le scénario WCF, vous devez compter sur le tracker de changement STE met en œuvre ainsi sur le côté serveur vous procédez comme suit.

db.Users.ApplyChanges(user);
db.SaveChanges();
scénario

2 Toutefois, si vous êtes sur le serveur, la pratique recommandée consiste à créer une méthode sur la classe partielle pour ObjectContext appelé EnableChangeTracking. La méthode interrogerait pour les entités qui sont dans un état stable qui implémente IObjectWithChangeTracker et tourne sur le suivi des modifications si quelque chose comme ceci

user = db.users.first(u => u.userid == 1);
db.EnableChangeTracking();

maintenant essayer de sauver l'entité utilisatrice d'un contexte différent dont il a été récupéré à partir de

db2.users.ApplyChanges(user);
db2.SaveChanges();
scénario

3 si du côté du serveur auquel vous êtes connecté au même contexte de l'objet à partir duquel vous avez récupéré l'entité utilisatrice à partir, vous utilisez STE aussi simple objet poco comme ci-dessous

user = db.users.first(u => u.userid == 1);
user.LastName = "XYZ";
db.DetectChanges(); //no need for it cuz Savechanges implicitly calls this.
db.SaveChanges();
scénario

4 si l'entité utilisateur est récupéré à partir d'un contexte différent alors le contexte u utilisera pour sauver puis est une autre option ici où u marquer l'entité telle que modifiée et fichait ce qui se est modifié.

user = db.users.first(u => u.userid == 1);
var db2 = new ObjectContext();
user.LastName = "XYZ";
db2.Users.Attach(user);
// i prefer this option..
db2.ObjectStateManager.ChangeObjectState(user,EntityState.Modified); 
db2.SaveChanges(); // updates all columns
scénario

5 si l'entité utilisateur est récupéré à partir d'un contexte différent alors le contexte u utilisera pour sauver puis est une autre option ici où u récupérer l'entité d'origine.

user = db.users.first(u => u.userid == 1);
user.lastName ="XYZ";
var db2 = new ObjectContext();
db2.Users.First(u => u.userid == user.userid);
db2.users.ApplyCurrentValues(user);
db2.SaveChanges();

Voici un blog qui décrit quelques scénarios. http: / /weblogs.asp.net/zeeshanhirani/archive/2010/03/30/modifying-self-tracking-entity-on-the-server.aspx

Je couvre largement ces concepts dans mon Entity Framework 4.0 recettes livre avec beaucoup de scénarios ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top