Comment Changer le nom de la clé primaire d'EF Premier Code?
J'ai un scénario où je voudrais changer la clé primaire nom de l'entité et d'être en mesure d'exécuter la mise à jour de la base de données -force. Voir ci-dessous pour le code et l'erreur devient quand j'essaie.
Entité:
public class Team
{
[Key]
[HiddenInput(DisplayValue = false)]
public virtual int Id { get; set; }
[Display(Name = "Full Name:")]
public virtual string Name { get; set; }
}
Entité Changé:
public class Team
{
[Key]
[HiddenInput(DisplayValue = false)]
public virtual int TeamId { get; set; }
[Display(Name = "Full Name:")]
public virtual string Name { get; set; }
}
Quand je lance Update-database -Force
j'obtiens l'erreur suivante.
Multiple identity columns specified for table 'Teams'. Only one identity column per table is allowed.
C'est une question de convention de nommage et j'ai besoin de ce TeamId quand j'référence à ce dernier, il suffit de conflit d'Id à l'enfant avec les classes d'entité.
Des idées sur comment je peux le faire avec succès?
Vous pouvez mapper TeamId à la clé primaire Id [Colonne("Id")] attribut ou faire les deux le nom de la colonne et de la POCO variable doivent être nommée TeamId?
Je suis en train d'essayer votre suggestion, je vais vous informer en une minute
hé, mon pote, votre suggestion semble être au travail et je vois que vous avez donné une réponse ci-dessous.
Je suis en train d'essayer votre suggestion, je vais vous informer en une minute
hé, mon pote, votre suggestion semble être au travail et je vois que vous avez donné une réponse ci-dessous.
OriginalL'auteur Komengem | 2012-12-12
Vous devez vous connecter pour publier un commentaire.
Dépend de la version de EF vous utilisez.
Même avec les migrations le résultat que vous allez voir, c'est quelque chose comme:
"liste déroulante de la colonne Id" et "ajouter une colonne TeamId".
Avec cela, vous allez perdre toutes les valeurs et les enfants des "connexions"......
Le seul "sécurisé" solution que je vois à ce point est un mélange des Migrations et de la "main les opérations SQL".
Solution FACILE:
1 - prenant en considération que vous avez déjà une "base" de la migration de la création de la table avec l'ID, maintenant créer la nouvelle migration "mettre à jour". Maintenant, ne l'exécutez PAS encore.
2 - Ouvrez ce fichier et écrire une nouvelle ligne AVANT les lignes générées et l'utilisation d'une commande SQL, quelque chose comme ceci:
Cela va changer le nom AVANT la migration supprime la colonne et en créer un nouveau, ce qui va arriver: vous modifiez le nom avant de le supprimer, puis supprimer est exécuté, mais il va "échouer", mais il ne fera pas mal rien.
Mais maintenant, vous vous demandez: pourquoi dois-je faire? eh bien, si vous utilisez des migrations, même si vous supprimez les lignes à supprimer la colonne et en créer un nouveau, la prochaine fois que vous créez automatiquement un nouveau fichier de migration de cette de nouvelles lignes seront là...... c'est pourquoi.
MISE À JOUR DES RÉPONSES #1
Quand je parle d'Entity Framework Migrations, je fais référence à ceci:
http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx
Lorsque vous Exécutez le lien " Ajoutez-la Migration AddBlogUrl’ de la commande dans la Console du Gestionnaire de Package, un nouveau fichier (*.cs) est créé.
Exemple de ce fichier de fichier de migration avec des commandes SQL:
Quand je parle d'Entity Framework Migrations, je fais référence à ceci: blogs.msdn.com/b/adonet/archive/2012/02/09/... Lorsque vous Exécutez le lien " Ajoutez-la Migration AddBlogUrl’ de la commande dans la Console du Gestionnaire de Package, un nouveau fichier (*.cs) est créé.
Pas sûr EF5 crée ce fichier car je ne peux pas trouver, à moins que je suis censé créer moi-même. EF5 crée une Configuration.cs dans la Migration de dossier. Ce fichier a interne d'une classe scellée qui a son pconstructor et une graine de méthode.
Maintenant, je comprends ce, afin de le marquer comme réponse
Merci 🙂
OriginalL'auteur Dryadwoods
Après de jongler avec la suggestion faite par les deux marvc1 et emanyalpsid. J'ai décidé de supprimer la base de données, et d'en créer de nouveau. Cela se fait par la simple suppression de la base de données dans l'Explorateur de serveurs dans VS2012, et assurez-vous également que l' .fichier mdf en vertu de App_Data est également supprimé. L' .fichier mdf est habituellement caché, le voir juste dans l'Explorateur de solutions barre d'outils, cliquez sur Afficher Tous les Fichiers et vous le verrez. lorsque ces étapes sont faites, il suffit d'exécuter le code ci-dessous dans le Gestionnaire de paquets de la Console:
-Verbose vous permet tout simplement de vérifier ce que vous êtes en train de créer.
marvc1 la Réponse de
Fonctionne très bien, sauf qu'il ne change pas les noms dans la base de données, si vous n'êtes pas trop inquiet au sujet de la base de données de noms, c'est le moyen le plus sûr d'aller à ce sujet.
Par noms dans la base de données que je veux dire,
In the entity Team, Id would still be Id and not TeamId
OriginalL'auteur Komengem
Solution la plus simple est de ne pas renommer la clé primaire dans la base de données et au lieu de la carte de votre classe à votre clé primaire et de lui donner le nom que vous voulez. Comme ceci:
Personnellement, j'aimerais garder le nom de la classe comme Id. La convention de nommage [Nomtable + Id] est de la vieille école et overkill pour une clé primaire (clé étrangère, il est bon). Pour moi, il ajoute juste le bruit de vos lignes de code.
team.TeamId
est pas mieux queteam.Id
.c'est ce que je suis se soucier de maintenant, le code a été exécuté avec succès, mais les noms dans la base de données reste comme avant, Pas sûr que j'aime cette idée. Je suis maintenant envisage déposer la base de données et re-créer à nouveau, à côté avec le premier code de la migration activé, ne devrait pas prendre longtemps.
Si vous n'êtes pas inquiet au sujet des données dans la base de données, puis il suffit de le déposer et de le recréer.
Le faire maintenant, il ne peut pas faire de mal à faire un peu plus de la saisie de données que de perdre plus de temps à essayer un meilleur moyen de contourner cela. Votre suggestion fonctionne bien, mais pas comme je le voudrais.
Vous pouvez toujours utiliser les semences méthode pour créer un échantillon de données, puis chaque fois que vous déposez une base de données que vous n'avez pas à recréer manuellement.
OriginalL'auteur Marvin Rounce
Utilisateur Dryadwoods recommande d'exécuter la requête sql suivante à l'intérieur de la migration:
mais :
donc, j'ai changer le code suivant:
attention, ce vieux nom devrait être pleinement nom, mais le nouveau nom doit être court. Sinon, il travaillera de manière incorrecte
OriginalL'auteur Oleg Sh