Entity Framework Code First Migrations: Définir La Clé Primaire De La Valeur
J'ai une table qui stocke des données supplémentaires pour certaines lignes d'une table:
public class QuoteExtra
{
[Key]
public int QuoteId { get; set; }
//More fields here
}
J'aimerais être en mesure d'ajouter des lignes à cette table où je définir explicitement le PK.
Si je la laisse comme ci-dessus, la définition de la valeur et de soumettre les causes de la ligne de la valeur à être supprimée et remplacée par la valeur auto-générée à partir de la base de données (et de la colonne est définie comme une colonne d'Identité dans le schéma).
Cela semble être la bonne solution:
public class QuoteExtra
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int QuoteId { get; set; }
//More fields here
}
Cependant cela me met à l'exception:
Impossible d'insérer une valeur explicite pour l'identité de la colonne dans la table 'EnumTest" quand IDENTITY_INSERT est réglé sur OFF.
Alors, comment puis-je écrire ma classe alors que je suis en mesure de définir la valeur d'une Clé Primaire en EF?
Edit:
J'ai essayé d'ajouter le Code suivant à base de Migration de set IDENTITY_INSERT SUR:
public override void Up()
{
Sql("SET IDENTITY_INSERT QuoteExtra ON");
}
J'ai couru et a essayé de nouveau, mais j'ai reçu la même réserve que ci-dessus. Ce qui est étrange, c'est la base de données ne reflètent ce paramètre, et l'exécution de SQL contre directement ne me permettent d'insérer des valeurs arbitraires pour la clé primaire - donc, il semblerait Cadre de l'Entité elle-même est l'application de cette règle, et en négligeant de reconnaître que IDENTITY_INSERT n'est pas en fait la valeur off. Dois-je besoin de le mettre quelque part en EF lui-même?
Edit 2:
J'ai mal compris IDENTITY_INSERT; j'ai supposé que le réglage une fois à gauche pour que le tableau indéfiniment. En fait, il vit aussi longtemps que la "Session", ce qui signifie que par exemple mettre une Migration signifie qu'il vit... tant que la Migration s'exécute, et n'a aucune incidence sur les futures connexions comme ma plus tard .Ajouter() avec EF, ce qui explique pourquoi j'ai toujours cette exception - le DB est vraiment la source de l'exception, pas de EF. Depuis IDENTITY_INSERT est limitée à au plus une table par session c'est un assez inefficace façon de le faire - ne pas créer une Identité PK colonne, en premier lieu, semble être une meilleure voie.
- Que voulez-vous dire par Ce qui est étrange, c'est la base de données ne reflètent ce paramètre?
- Ce que je voulais dire, c'est que j'ai réussi à insérer des valeurs, si j'ai utilisé SQL brut à le faire après l'exécution de la identity_insert sur commande, mais maintenant je vois pourquoi - c'est parce que le paramètre est activé pour la durée d'une session, et en raw SQL dans Sql Server Management Studio, j'ai séjourné à l'intérieur de la durée d'une session, alors que mon EF migration et suivants du code de test sont des sessions séparées.
- Oui. L'identité insertion est lié à la connexion. Si vous assurer que votre code est en cours d'exécution dans la même connexion, vous devriez être en mesure de l'utiliser. Mais c'est en quelque sorte la magie noire, surtout en tenant compte des migrations.
Vous devez vous connecter pour publier un commentaire.
C'est la bonne façon de créer un PK sans Identité incrémentation automatique activée:
Toutefois, si vous ajoutez DatabaseGenerated(DatabaseGeneratedOption.None)] après EF Migrations a déjà créé la table, tranquillement il ne fait rien pour la table. Si c'est votre cas, vous devez ajouter une migration manuelle pour supprimer la table:
Et dans la migration:
EF Migrations Automatiques seront alors automatiquement recréer la table sans la contrainte d'Identité, ce qui vous permettra ensuite de définir la valeur de clé primaire à tout moment, sans avoir à exécuter toutes les commandes spéciales comme IDENTITY_INSERT SUR.
Il sonne comme un moins destructrice façon de le faire est de venir en EF7 ("Données de Mouvement"), ou vous pouvez écrire beaucoup de manuel sql-vous dans la migration de créer des tables temporaires et déplacer des données si vous voulait éviter de perdre des données existantes dans la table.
EDIT: en Fonction de votre scénario EF Migrations pourraient ne pas recréer la table si la classe existe déjà et est déjà ajouté à votre DbContext il suffit de les déposer et de les déposer à l', ce qui signifie que votre migration manuelle a non seulement de chute, mais aussi de créer de la table. Pas une grosse affaire depuis le scaffolding code EF Migrations génère pour vous de ajouter-la migration de créer ces instructions pour vous, mais c'est un peu plus de code pour vérifier plus de questions.
C'est la bonne solution, mais seulement pour une nouvelle table. Si vous modifiez la base de données générée option pour une table existante, EF migrations ne sont pas en mesure d'effectuer ce changement et votre
QuoteId
colonne est toujours marquée commeIdentity
dans la base de données.IDENTITY_INSERT
réglage. Ma réponse ciblée de votre jeu avecDatabaseGeneratedOption
.Je pouvais pas résoudre ce Problème grâce à vos Conseils j'ai essayé de re-créer la Base de données entière, mais ce nétait pas de travail, aussi.
Pour corriger cela, vous devez retirer le identité: vrai bien sur la première(!) la création de la Colonne (par exemple, Migration).
Peut-être que ça aidera quelqu'un..