Numérotation automatique avec Entity Framework

auto-increment c# entity-framework exception

Question

Je souhaite parcourir une collection d'objets et les ajouter tous à une table. La table de destination a un champ auto-incrémenté. Si j'ajoute un seul objet, il n'y a pas de problème. Si j'ajoute deux objets avec la clé primaire égale à zéro, la structure de l'entité échoue. Je peux spécifier manuellement les clés primaires, mais l’essentiel de l’essai de l’EF était de vous faciliter la vie et non de la compliquer davantage. Voici le code et l'exception reçue suit.

foreach (Contact contact in contacts)
{               
    Instructor instructor = InstructorFromContact(contact);             
    context.AddToInstructors(instructor);               
}

try
{                   
    context.SaveChanges();                  
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}

L'erreur est:

System.InvalidOperationException : les modifications apportées à la base de données ont été validées avec succès, mais une erreur s'est produite lors de la mise à jour du contexte de l'objet. ObjectContext peut être dans un état incohérent. Message d'exception interne: AcceptChanges ne peut pas continuer car les valeurs de clé de l'objet sont en conflit avec un autre objet dans ObjectStateManager. Assurez-vous que les valeurs de clé sont uniques avant d'appeler AcceptChanges. sur System.Data.Objects.ObjectContext.SaveChanges (options SaveOptions)
à System.Data.Objects.ObjectContext.SaveChanges () à DataMigration.Program.CopyInstructors () dans C: \ Projects \ DataMigration \ Program.cs: line 52

Réponse acceptée

Définissez l'attribut StoreGeneratedPattern sur "Identity" dans votre SSDL pour le champ d'auto-incrémentation. Cela devrait aider.


Réponse populaire

Cela se produit car, bien que la valeur générée automatiquement de la colonne ait été créée dans la base de données, EF ne l'a jamais su.

Donc, pour informer EF que la base de données va gérer la valeur générée, vous devez ouvrir votre fichier edmx (j’utilise toujours l’éditeur XML de VS) et dans la zone SSDL (Store attribuez StoreGeneratedPattern = "Identity" à la colonne qui nécessite le modèle généré. De cette manière, EF lit la valeur générée dans la base de données et la stocke dans la mémoire cache.

La définition de votre type d’entité ressemblera plus ou moins à ceci:

 <EntityType Name="INVOICE">
          <Key>
            <PropertyRef Name="CODE" />
          </Key>
          <Property Name="CODE" Type="varchar" Nullable="false"
              MaxLength="10" StoreGeneratedPattern="Identity"/>                 
 </EntityType>

Sachez que si vous mettez à jour votre modèle, toutes ces modifications seront perdues et vous devrez répéter tout le processus.

Cela fonctionne pour EF 1.0, je ne sais pas si dans EF4 tous ces problèmes sont déjà résolus.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow