Comment prévenir DbContext de la modification de la base de données?
J'apprends le Cadre de l'Entité (actuellement à l'aide de EF6 beta) et je suis en utilisant le code de motif sur une base de données existante. Les entités et les DbContext
classe sont créés automatiquement à l'aide d'un modèle T4.
Je tiens à prévenir la DbContext
de créer /modifier quoi que ce soit dans la base de données lors de l'exécution.
Comment puis-je le faire?
Comment avez-vous créer votre base de données? EF Premier Code par défaut ajoute une table de la base de données pour être en mesure de dire si votre modèle a changé. Si la base de données n'a pas été creqated par codefirst/migrations il n'y a pas de données dans la db et EF ne touche pas le schéma de la databse. Si vous parlez des données - chaque fois que vous appelez .SaveChanges() de données dans la base de données peuvent être ajoutés/modifiés/supprimés
CodeFirst ne changera pas votre base de données si elle n'a pas le créer.
Eh bien, il fait de créer de nouveaux objets, car je n'ai pas cartographié les schémas correctement au premier abord. J'ai fini par avoir toutes les tables recréé par défaut dans le schéma dbo.
Oui, il créé de nouveaux objets, car il n'a pas pu trouver, parce qu'ils n'ont pas été définis dans le schéma par défaut. A noter que depuis elle a créé des tableaux, il a également ajouté les migrations table d'historique où il conserve des informations sur les modèles. Par conséquent, il a été en mesure de dire que le modèle a changé, mais en comparant les tableaux qu'il a créées et non pas celles qui existaient déjà. Il permettra également d'utiliser les tableaux qu'il a créées et non l'original. Après la désactivation de l'initialiseur, si vous modifiez le modèle de votre modèle ne correspond plus à la base de données et peut causer des problèmes d'exécution ou de corruption de données.
Vous devez utiliser
CodeFirst ne changera pas votre base de données si elle n'a pas le créer.
Eh bien, il fait de créer de nouveaux objets, car je n'ai pas cartographié les schémas correctement au premier abord. J'ai fini par avoir toutes les tables recréé par défaut dans le schéma dbo.
Oui, il créé de nouveaux objets, car il n'a pas pu trouver, parce qu'ils n'ont pas été définis dans le schéma par défaut. A noter que depuis elle a créé des tableaux, il a également ajouté les migrations table d'historique où il conserve des informations sur les modèles. Par conséquent, il a été en mesure de dire que le modèle a changé, mais en comparant les tableaux qu'il a créées et non pas celles qui existaient déjà. Il permettra également d'utiliser les tableaux qu'il a créées et non l'original. Après la désactivation de l'initialiseur, si vous modifiez le modèle de votre modèle ne correspond plus à la base de données et peut causer des problèmes d'exécution ou de corruption de données.
Vous devez utiliser
.ToTable(tableName, schemaName)
à la carte pour une table qui est en non-valeur par défaut de schéma.OriginalL'auteur Crono | 2013-09-18
Vous devez vous connecter pour publier un commentaire.
Lorsque vous ne permettre les migrations commande, il vous sera présenté avec dossier /Migrations en vertu de laquelle vous pouvez rechercher un fichier nommé de Configuration.cs. Dans le constructeur de ce fichier, par défaut, il y a un ensemble de propriétés pour valeur:
Qui fera en sorte que votre base de données ne seront pas migrés automatiquement, mais plutôt par l'invocation de chaque migration manuellement.
Toutefois, si votre base de données est plus grande que les modèles de domaine, c'est à dire que vous êtes juste d'exploitation sur la partie de la base de données existante, puis, quelque part dans votre démarrage de l'application (si elle est ASP.NET app, Application_Start gestionnaire d'événement), vous devez ajouter le code suivant:
Sinon, Entity Framework va se plaindre qu'il y a un décalage entre la base de données de définition de votre modèle de domaine et de l'état actuel de la base de données.
EDIT:
Si vous voulez être sûr que YourDbContext n'est pas la tentative de modification de la base de données, faites ceci:
MODIFIER à nouveau:
J'essaie de comprendre quel est le scénario qui sont que vous essayez d'accomplir. Si vous avez de la base de données existante, et vous voulez mettre à jour, mais seulement manuellement, c'est l'approche:
à partir de la base de données existante.
correctement. Vous pouvez le supprimer.
ChangeName. Ce n'iront pas en base de données, à moins que vous ne
mise à jour de la base de données.
Ok j'essaie de comprendre ce que vous essayez de faire. J'ai édité mon post à nouveau, voir si cela fait sens pour vous maintenant.
Comme je l'ai dit j'ai un T4 modèle qui génère des entités et DbContext. J'ai besoin de ce que j'ai de nommage des interfaces et la mise en œuvre des exigences à suivre. Le générateur par défaut n'a pas donné de moi un moyen efficace pour permettre que cela arrive (sauf si je suis bien désemparés sur la façon dont il fonctionne). Pourtant, je pense que votre réponse est assez complet, donc je vais le marquer comme acceptée. Merci beaucoup pour toute votre aide. 🙂
Je veux l'EF pour créer la Table, mais je n'en veux pas à ajouter une histoire de la migration de la table. Comment puis-je y parvenir?
OriginalL'auteur Admir Tuzović
Définir la initialiser votre contexte de
null
.Qui devrait partir de la base de données dans son état actuel, au démarrage de l'application.
Notez que vous aurez une exception, si vous essayez d'exécuter l'application après la modification de votre dbContext classe et/ou de votre schéma de base de données, comme votre schéma de base de données ne correspondent plus à ce que le contexte s'y attend.
Si vous êtes inquiet au sujet de la structure de la base de données en cours de modification, vous pouvez simplement modifier la chaîne de connexion de votre contexte, de ne pas lui donner create/alter table des privilèges. Si vous êtes préoccupé par le contenu de vos tables existantes cours de modification, vous pouvez utiliser une chaîne de connexion qui a lu uniquement les autorisations pour les tables que vous souhaitez protéger. Edit: pour clarifier, vous aurez besoin de définir de nouvelles (restreint) des comptes dans votre SQL server, et changez de chaînes de connexion afin de vous connecter à l'aide de ces comptes.
Pour remédier à ceci: "j'aurais voulu lever une exception sur SaveChanges si le contexte est réglé de sorte à ce que la base de données des modifications sont autorisés.", J'ai modifié mon post. Vérifier la solution entre les MODIFIER, il pourrait vous aider.
Je ne suis pas à l'aide d'une connexion dédiée chaîne pour que dbcontext, il peut être utilisé avec n'importe quel DBConnection instance. Si pour une raison quelconque un utilisateur n'a pas été accordé des privilèges sur une table puis je préfère avoir l'application de jeter une SecurityException plutôt que de simplement extraire / écriture de données, de toute façon. C'est une question importante, je ne peux pas tourner mon dos sur, je le crains. :s
Je ne suis pas sûr de comprendre votre question. Si vous ne voulez pas que votre demande de mettre à jour les données, pourquoi ne pas tout simplement s'abstenir d'appeler
SaveChanges()
? Si vous avez besoin de vérifier si un utilisateur est autorisé à apporter des modifications avant d'appelerSaveChanges()
, pourquoi ne pas envelopper le contexte d'une couche de logique métier qui applique ces règles? Si vous avez besoin de sql server pour empêcher l'écriture/modification, pourquoi ne pas attribuer une coutume de la chaîne de connexion pour EF à utiliser? Si vous avez besoin de cacher le contexte des autres assemblées, pourquoi ne pas faireinternal
?OriginalL'auteur ThinTim
J'ai eu ce problème avec DBFirst et EF 6.1 il a été la création d'une nouvelle table à partir de la EntityName. J'ai donc modifié le OnModelCreating méthode virtuelle de la carte de mes tables.
Donc, si le EntityName a été nommé MyStuffs puisque par défaut le EnitityNames sont la marque du pluriel qui vous avez la possibilité de désélectionner qu'au cours de l'EF génération. Dans mon cas, l'assistant a été la génération de la pluralisation de la version de la table.
OriginalL'auteur wchoward