2010-10-06 5 views
4

J'ai cette applikation qui est en fait deux applications, une application web et une application console. L'application console est utilisée comme une tâche planifiée sur la machine Windows et est exécutée 3 fois par jour pour effectuer un travail récurrent. Les deux applications utilisent le même modèle et le même référentiel qui est placé dans un projekt séparé (bibliothèque de classes). Le problème est que si l'application console doit apporter des modifications à la base de données, elle met à jour l'entité du modèle et enregistre les modifications dans la base de données mais le contexte de la webbapplication ne le reconnaît pas et le contexte de l'objet n'est pas actualisé. nouvelles/mises à jour et l'utilisateur de l'application ne peut pas voir les changements.Assurez-vous que Entity Framework lit toujours à partir de la base de données?

Ma question est la suivante: Existe-t-il un moyen de dire à l'objetcontexte de toujours charger les données de la base de données, soit sur le trou objectcontext ou pour une requête spécifique?

/Salutations Vinblad

Répondre

2

Je ne pense pas que vous devriez avoir ce problème dans l'application web. ObjectContext dans l'application Web doit être créé par requête afin que le traitement des demandes lors de la mise à jour soit affecté.

Quoi qu'il en soit, il existe peu de méthodes pouvant forcer ObjectContext à recharger des données. Les requêtes et les fonctions de chargement permettent de passer MergeOption qui devrait pouvoir écraser les données actuelles. Mais le plus intéressant devrait être la méthode Refresh en particulier avec this application.

1

Chaque fois que vous lancer quelque chose comme

context.Entities.FirstOrDefault() 

ou tout autre requête sur le contexte, les données sont en fait extraites de la base de données, vous ne devriez pas avoir un problème.

Quelle est votre durée de vie ObjectContext dans la webapp? Le ObjectContext est un UnitOfWork, il doit donc être créé uniquement pour récupérer/écrire/mettre à jour les données et être éliminé rapidement par la suite. Vous pouvez trouver une question similaire ici:

Refresh ObjectContext or recreate it to reflect changes made to the database?

+5

Ce n'est pas vrai. Si vous exécutez votre requête, modifiez vos données dans la base de données et réexécutez la requête dans le même contexte, vous ne recevrez pas de nouvelles données. ObjectContext implémente plusieurs modèles - celui-ci s'appelle Identity Map, ce qui signifie que l'entité de la même clé n'est chargée qu'une seule fois. –

+0

Merci Yakimych pour l'info, le lien que vous m'avez fourni m'a amené dans la bonne direction, il s'est avéré que j'avais besoin de support pour PerWebRequest dans Unity (j'ai utilisé cette implémentation qui semble fonctionner: http://weblogs.asp.net /rashid/archive/2009/02/15/asp-net-mvc-unity-and-common-service-locator.aspx) – Vinblad

+0

@Ladislav - merci pour la correction! @Vinblad - content que je pourrais aider;) – Yakimych

0

FWIW, la création d'un nouvel objet (anonyme) dans la requête oblige également un aller-retour à la base de données:

' queries from memory  
context.Entities.FirstOrDefault() 

' queries from db 
context.Entities.Select(Function(x) New With {p.ID, p.Name}).FirstOrDefault() 

S'il vous plaît pardonnez le VB, il est mon natif langue :)

1

Par En utilisant un DbSet, vous pouvez également utiliser la méthode .AsNoTracking().

+0

C'est en fait une bonne réponse. Ajoutez simplement .AsNoTracking() dans le cadre de votre requête et la structure de l'entité ne s'appuiera pas sur les instances en mémoire des objets. –

Questions connexes