Quels sont les inconvénients à un arrêt de ProxyCreationEnabled pour CTP5 de EF premier code
La seule façon que mon service WCF peuvent retourner des classes à partir d'un code premier modèle est par définition de la ProxyCreationEnable
à false
à l'aide du code ci-dessous.
((IObjectContextAdapter)MyDb).ObjectContext.ContextOptions.ProxyCreationEnable = false;
Quelles sont les conséquences négatives de cette mesure? Un gain, c'est que je peux obtenir au moins de ces dynamiques sérialisé, de sorte qu'ils peuvent être envoyés sur le fil à l'aide de la WCF.
Vous devez vous connecter pour publier un commentaire.
Proxies dynamiques sont utilisés pour le suivi des modifications et de chargement paresseux. Lors de la WCF essaie de sérialiser un objet, contexte connexe est habituellement fermé et éliminées mais la sérialisation des propriétés de navigation déclenche automatiquement le chargement paresseux (fermé de contexte) => exception.
Si vous éteignez le chargement paresseux, vous aurez besoin d'utiliser désireux de chargement pour toutes les propriétés de navigation que vous souhaitez utiliser (Inclure sur ObjectQuery). Suivi de l'évolution ne fonctionne pas sur WCF il ne fonctionne que pour la modification de l'entité à laquelle est attaché à ObjectContext.
Si
DbContext.Configuration.ProxyCreationEnabled
est fixé àfalse
, DbContext ne prendra pas en charge les objets enfants par un parent de l'objet, à moins queInclude
méthode est appelée sur l'objet parent. RéglageDbContext.Configuration.LazyLoadingEnabled
àtrue
oufalse
n'aura pas d'impact sur ses comportements.Si
DbContext.Configuration.ProxyCreationEnabled
est fixé àtrue
, enfant objets seront chargés automatiquement, etDbContext.Configuration.LazyLoadingEnabled
de la valeur de contrôle lorsque l'enfant objets sont chargés.Lorsque vous utilisez EF, il crée un proxy par défaut pour votre classe. Une solution peut être d'ajouter cette ligne dans le constructeur de votre classe DbContext. Votre modèle de données héritées de la classe DbContext, de sorte que vous pouvez modifier votre modèle comme ceci:
Cette classe est dans votre
EF.edmx
puis dans leyourmodel.Context.tt
puisyourmodel.Context.cs
public Blobb(bool dummy = true){...}
. Personnellement, j'utilisepublic Blobb(string connectionString) : base(connectionString)
parce que je n'aime pas le stockage des informations d'identification dans mon AppSettings fichier.(À l'aide de Visual Studio 2013 ou plus tard)
Pour éviter de le modifier de la catégorie constructeur de votre modèle EF chaque fois que vous actualisez le modèle de la base de données, ou une autre façon de déclencher la reconstruction du code, le bon endroit pour le faire, le changement est dans l'T4 fichier de code qui est responsable de la création du modèle de code.
J'ai eu un autre problème avec des propriétés dynamiques d'un quelques années en arrière lorsque j'ai compris les mécanismes sous-jacents de la façon dont les classes et les propriétés a été effectivement créée. T4!!! Quel miracle il est: D
T4 syntaxe peut être un peu intimidant au premier abord, donc, la lecture sur la syntaxe est sage. Étant TRÈS concentré lors de la prise de modifications est également une bonne idée 🙂
Donc! Si vous regardez dans votre modèle, vous avez un .tt le fichier dans votre .fichier edmx. C' .tt (T4) est le script qui crée réellement votre modèle de classe. Le script va s'exécuter automatiquement chaque fois que vous construisez votre modèle ou à faire quelques changements dans l'éditeur de modèle.
Disons que votre Modèle de descripteur de fichier est nommé Model1.edmx.
Vous avez un fichier nommé Model1.Contexte.tt dans l'arbre sous elle. Vous verrez aussi une Model1.Contexte.cs fichier. C'est évidemment la réelle fichier de code pour votre contexte. Mais ce fichier est le résultat de la .tt fichier de script en cours d'exécution! Il est entièrement créé dynamiquement. Donc aucune idée de l'éditer.
Ouvrez le .tt fichier et vous verrez quelque chose comme:
Un autre 50 lignes plus bas, le code du constructeur est scripté.
J'ai ajouté la propriété
base.Configuration.ProxyCreationEnabled = false;
de sorte que ce sera la toute première ligne dans le constructeur.Enregistrer votre fichier et ouvrez le Model1.Contexte.cs fichier pour voir le code résultant.
Si vous souhaitez forcer le modèle de script à exécuter, sélectionnez le menu
Il est facile de savoir si vous avez fait une erreur dans votre T4 de code, comme l' .cs fichier sera pas faite du tout, ou avec des erreurs évidentes si vous l'ouvrir dans l'éditeur.