2010-10-10 20 views
1

Je me demande si quelqu'un peut m'aider?EF 4: Problèmes de compréhension de DetectChanges lors de l'utilisation de POCO (pas d'ObjectContext auto-suivi)

Je n'arrive pas à comprendre pourquoi je dois émettre des DetectChanges sur mes entités POCO (non proxy).

Bien sûr, j'ai cette ligne pour m'assurer que les procurations ne sont pas retournées.

context.ObjectStateManager.GetObjectStateEntry(order).State 

Et faire quelques recherches, il semble si je dois vérifier l ' « état » d'un objet alors que je dois donner detechChanges Mais pourquoi aurais-je besoin de vérifier l'état d'un objet?

Fondamentalement, j'envoie le long de mon entité POCO à une méthode qui permet d'enregistrer les données vers un nouveau ObjectContext (que je crée et détruisons ObjectContext sur chaque méthode)

Par conséquent, je vais avoir du mal à comprendre pourquoi je aurais besoin d'avoir ObjectContext suivre ou être au courant des changements?

Est-ce parce que si ce n'est pas conscient si ne sera pas sauvé? Peut-être que je suis mal informé mais il semble que si j'utilise un ObjectContext existant (que je ne suis pas en train de créer et de détruire à chaque fois) qui assure que ObjectContext est conscient serait bénéfique mais sinon non?

Donc, dans la méthode 1, je suis en train de mettre à jour un objet en créant un nouveau datacontext, en l'enregistrant dans la base de données et en détruisant ObjectContext. Par conséquent, je n'utilise pas 2 méthodes, 1 méthode pour envoyer la mise à jour ou le nouvel enregistrement et une autre méthode pour l'ÉCONOMIE.

J'apprécierais vraiment toute explication rapide de pourquoi est-ce nécessaire?

Merci à l'avance

Répondre

5

Votre question est peu déroutant. Vous écrivez à propos d'Entity Framework mais en utilisant DataContext qui est lié à LinqToSql.

Le comportement diffère de la façon dont vous utilisez ObjectContext. Lorsque vous chargez l'entité POCO à partir de la base de données ObjectContext conserve son instance dans la carte d'identité interne. Par défaut, POCO n'utilise aucun type de suivi des modifications. Lorsque vous enregistrez cette entité POCO dans même instance d'ObjectContext, elle appelle en interne DetectChanges pour comparer l'état de l'entité actuelle avec l'état stocké. Cette comparaison définit quelles colonnes doivent être mises à jour. L'appel interne à DetectChanges est un comportement par défaut qui peut être désactivé de sorte que vous devrez appeler cette méthode manuellement.

Dans votre scénario n'utilisant pas la même instance d'ObjectContext. Dans ce cas, vous devez d'abord attacher l'entité POCO à ObjectContext. MSDN dit strictement que lors de l'attachement d'entité, il est marqué comme Inchangé. Pour cette raison, vous devez dire ObjectContext que l'entité a changé. Vous pouvez le faire pour whole entity ou vous pouvez définir exactement quels properties ont changé, mais vous devez le faire manuellement = vous devez stocker cette information quelque part (les entités de suivi automatique peuvent vous aider avec cela mais ils ont disadvantages).

+0

Merci ..., oui .. désolé j'ai fait une faute de frappe .. son objectcontext pas datacontext :-) – Martin

+0

J'ai mis à jour ma question avec la faute corrigée. Je vous remercie. Peut-être que je devrais utiliser hte ObjectContext? J'ai un modèle de dépôt (classe) ... et je crée un nouveau ObjectContext sur chaque méthode entourée par une instruction Using afin qu'elle soit créée et détruite.Peut-être que je devrais le créer en tant que variable de niveau de classe .. par conséquent il est créé quand je crée une instance de hte class (repository) et détruit quand l'instance n'existe plus? Pensez-vous que c'est une meilleure façon d'avancer? J'ai lu que garder ObjectCOntext en vie n'est pas une idée de godo ??? – Martin

+0

Cela dépend du type d'application et de la façon dont vous utilisez le référentiel. Garder ObjectContext vivant pendant longtemps n'est pas une bonne idée, sauf quelques scénarios dans l'application WinForm ou WPF. Mais garder ObjectContext en vie pour une requête web unique est totalement OK. Cochez mon autre réponse pourquoi long contextes vivants et partagés ne sont pas une bonne idée: http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392 –