web-dev-qa-db-fra.com

Désactiver le chargement différé par défaut dans Entity Framework 4

Il semble que le chargement différé soit activé par défaut dans EF4. Au moins, dans mon projet, je peux voir que la valeur de

dataContext.ContextOptions.LazyLoadingEnabled

est vrai par défaut. Je ne veux pas de chargement paresseux et je ne veux pas avoir à écrire:

dataContext.ContextOptions.LazyLoadingEnabled = false;

chaque fois que je reçois un nouveau contexte. Existe-t-il un moyen de le désactiver par défaut, par exemple, dans l'ensemble du projet?

60
Mike Chamberlain

La réponse suivante fait référence à Base de données en premier ou Modèle en premier workflow ( les deux seuls workflows disponibles avec Entity Framework (version <= 4.0) lorsque la question a été posée). Si vous utilisez le flux de travail Code-First (qui est disponible depuis la version EF> = 4.1), passez à réponse de ssmith question pour une solution correcte.


Le fichier edmx a dans le <ConceptualModel> et <EntityContainer> définition d'un attribut pour le chargement différé où vous pouvez définir le chargement différé généralement sur faux:

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false">

Cela crée le paramètre suivant dans le constructeur ObjectContext:

public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext")
{
    this.ContextOptions.LazyLoadingEnabled = false;
    OnContextCreated();
}

Mon exemple ne signifie pas que le ObjectContext (ou DbContext généré dans les versions EF plus récentes) doit être modifié manuellement (ce qui serait écrasé avec chaque mise à jour de modèle de la base de données, comme l'a souligné ctorx ) mais que l'élément EntityContainer dans le edmx:ConceptualModels la section du fichier EDMX doit être modifiée en ajoutant annotation:LazyLoadingEnabled="false" attribut - manuellement dans un éditeur XML ou sur la page des propriétés de la surface du concepteur où cette option est également disponible, cliquez avec le bouton droit sur EDMX puis sur Propriétés.

enter image description here

Cette modification du fichier EDMX générera automatiquement la classe de contexte avec l'option de chargement différé désactivée dans le constructeur, comme indiqué ci-dessus. La modification du fichier EDMX lui-même n'est pas écrasée lorsque le modèle est mis à jour à partir de la base de données.

67
Slauma

J'ai écrit un exemple rapide montrant comment les nouvelles fonctionnalités de chargement paresseux fonctionnent avec EF Code First . Atteindre ce que vous voulez dans le modèle Code First consiste simplement à ajouter une ligne au constructeur de votre DbContext, comme ceci:

public BlogContext()
{
    this.Configuration.LazyLoadingEnabled = false;
}
61
ssmith

Si vous utilisez d'abord le code EF4, oui? Donc, dans l'initialisation de votre contexte, il y a le remplacement de 'OnModelCreated'.

Dans cette méthode, j'ai simplement appelé et défini la propriété et tout a été résolu.

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
     base.Configuration.LazyLoadingEnabled = false;
}

Mon modèle est maintenant beaucoup plus agréable au goût. Le chargement paresseux est génial ... mais pas quand vous ne le voulez pas. Et quand vous commencez à avoir des références circulaires, c'est tout simplement ridicule.

24
beauXjames

Vous pouvez également le faire à partir du concepteur. Ouvrez simplement le fichier .edmx, faites un clic droit n'importe où sur le modèle et choisissez Propriétés. Ensuite, définissez LazyLoadingEnabled sur false. enter image description here

23
Amin Saqi

Si vous modélisez le code en premier, supprimez simplement le mot clé virtual sur vos propriétés de référence/objet. Le fait d'avoir virtuel sur une référence activera LazyLoading sur cette référence particulière.

4
Todd