8
votes

Effectuer une identité_insert à l'aide de Code EF5 Premières migrations

J'ai un POCO que j'essaie de créer des migrations de code de code et ensuite des données de semences. Le problème est que je souhaite insérer des valeurs spécifiques dans la colonne d'identité lors de l'ensemencement.

voici mon poco xxx

et voici mon appel addorupdate dans la méthode de la graine de la configuration.cs xxx P> Comme prévu, il n'entre pas les valeurs de 101 et 201, mais à la place 1 et 2. Y a-t-il des donnéesATRibutes que je peux appliquer au modèle pour aider à cela?


3 commentaires

Voulez-vous désactiver complètement les insertions d'identité? Ou juste pour votre méthode de semence?


Au départ, je pensais que pour la semelle seulement ... mais s'il y avait un moyen pour les premières migrations de code pour identifier la colonne ID comme clé primaire, mais avec une identité, cela serait également acceptable.


Utilisez-vous l'entitéypeconfiguration ? Si oui, vous pouvez utiliser une propriété (x => x.id) .hasdatabaseGeneratedoption (base de donnéesGeneratedoption.non e). Vous pouvez éteindre cette option sur votre option sur votre ONModelCreat et cette.database.Initialiser (Force: True); dans le contructeur.


4 Réponses :


19
votes

Ceci comment désactiver l'identité via Attribut / Conventions

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Result>().Property(x => x.ResultId)
               .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    }


2 commentaires

Merci @aron, j'ai inséré avec succès dans le champ Identity à l'aide de la méthode Attributs que vous avez spécifiée.


Si l'OP a besoin d'identifiy_insert, c'est parce qu'ils ont une colonne d'identité. Vous ne pouvez pas simplement supprimer cette colonne d'identité pour effectuer une identité_insert. Ensuite, vous auriez besoin d'une autre migration pour allumer à nouveau l'identité pour cette colonne. Beaucoup mieux pour utiliser SQL brut et ne pas changer le schéma de base de données pour certains inserts.



6
votes

au cas où n'importe qui est toujours confus. . .

voir ci-dessous pour obtenir des informations supplémentaires nécessaires pour que identity_insert fonctionne avec le code de graine de migration de code - Première migration ()

J'ai utilisé la mise en œuvre d'Aron du système . ComponentModel.DataNotations.schema.databaseGénerated Attribut Pour définir la propriété Créé par la DB du modèle à "None", mais je ne pouvais toujours pas dépasser l'erreur d'insertion d'identité. Je pensais que je publierais mes conclusions ici au cas où quelqu'un d'autre a toujours des problèmes.

Pour le faire fonctionner, j'ai enveloppé la logique de la méthode de la graine dans une transaction SQL et utilisé context.database.executeqlCommand ("Set Identity_insert MyTable MyTable sur") Pour autoriser l'insertion avant Pour exécuter la méthode .AddorUpdate () . Voici mon fichier configuration.vb (à l'aide d'une table pour les types d'API Google comme exemple de données): xxx


0 commentaires

3
votes

Après avoir recherché à cela, il semble que la clé ait été créée précédemment, puis vous ajoutez [Généra de base de données (base de donnéesGéneratedoption.none)] Dans une migration Il ne fera pas réellement ce que vous souhaitez, vous pouvez vérifier cela en allant à la table de l'explorateur de la base de données. -> KEYS -> PK -> Modifier et voir la spécification d'identité est défini sur Oui au lieu de non.

Si tel est le cas, essayez de migrer jusqu'à un point où cette table n'existait pas et remue-t-elle ensuite.


1 commentaires

Tu as vraiment fait ma journée! Merci!



0
votes

Si vous utilisez automapper et utilisez le mode pour / foreach, vous devez remettre à la boucle pour boucle.

Exemple: P>

foreach (var item in Ids) {
    var page = Mapper.Map<Pages>(model);
    .
    .
    .
    .
    db.Pages.Add(page);
}
db.SaveChanges();


0 commentaires