Asics Lo Whizzer Chaussure Asics Homme zMUpVS

Question

Je reçois l'exception suivante sur mon projet;

Une exception de type 'System.InvalidOperationException' s'est produite dans EntityFramework.dll mais n'a pas été gérée dans le code utilisateur

Informations complémentaires: L'enregistrement ou l'acceptation des modifications a échoué car plusieurs entités de type 'MyProject.Data.Poco.MyProjectCountry' ont la même valeur de clé primaire. Assurez-vous que les valeurs de clé primaire explicitement définies sont uniques. Assurez-vous que les clés primaires générées par la base de données sont correctement configurées dans la base de données et dans le modèle Entity Framework. Utilisez le concepteur d'entité pour la configuration de base de données d'abord / modèle d'abord. Utilisez l'API fluide «HasDatabaseGeneratedOption» ou «DatabaseGeneratedAttribute» pour la configuration Code First.

using (MyProjectDataContext context = new MyProjectDataContext())
                {
                    MyProjectItemTag existingItemTag = (from p in context.ItemTags.Include(p => p.MyProjectGenre).Include(p => p.MyProjectCountry)
                                                     where p.MyProjectUser.UserId == ItemTag.MyProjectUser.UserId &&
                                                           p.MyProjectItem.ItemId == MyProjectItem.ItemId
                                                     select p).FirstOrDefault();


                    // new tag
                    if (existingItemTag == null)
                    {
                        existingItemTag = ItemTag;
                        existingItemTag.MyProjectItem.ItemId = MyProjectItem.ItemId;
                    }
                    // existing tag
                    else
                    {
                        existingItemTag.MyProjectItem = new MyProjectItem { ItemId = MyProjectItem.ItemId };
                        existingItemTag.MyProjectUser = new MyProjectUser { UserId = ItemTag.MyProjectUser.UserId };
                    }
                    // updates
                    existingItemTag.MyProjectCountry = MyProjectCountry;
                    if (MyProjectCountry != null)
                        existingItemTag.MyProjectCountry = new MyProjectCountry()
                        {
                            MyProjectCountryId = MyProjectCountry.MyProjectCountryId
                        };
                    existingItemTag.MyProjectGenre = MyProjectGenre;
                    context.Entry(existingItemTag.MyProjectItem).State = EntityState.Unchanged;
                    context.Entry(existingItemTag.MyProjectUser).State = EntityState.Unchanged;
                    context.Entry(existingItemTag.MyProjectCountry).State = EntityState.Unchanged;
                    context.Entry(existingItemTag.MyProjectGenre).State = EntityState.Unchanged;
                    if (existingItemTag.MyProjectCountry != null)
                    {
                        context.Entry(existingItemTag.MyProjectCountry).State = EntityState.Unchanged;
                    }
                    // db
                    context.ItemTags.AddOrUpdate(existingItemTag);
                    context.SaveChanges();
                    return existingItemTag.ItemTagId;
                }
            }

l'erreur se produit à la ligne suivante;

 context.Entry(existingItemTag.MyProjectCountry).State = EntityState.Unchanged;

Ma classe;

 public class MyProjectItemTag
    {
        public int ItemTagId { get; set; }
        public MyProjectUser MyProjectUser { get; set; }
        public MyProjectItem MyProjectItem { get; set; }
        public MyProjectCountry MyProjectCountry { get; set; }
        public MyProjectGenre MyProjectGenre { get; set; }
        public MyProjectMood MyProjectMood { get; set; }
        public MyProjectItemTag()
        {

        }
        public MyProjectItemTag(string userId, string providerContentId)
        {
            MyProjectUser = new MyProjectUser
            {
                UserId = userId
            };
            MyProjectItem = new MyProjectItem
            {
                ProviderContentId = providerContentId
            };

}} Xy613 Torpatoffeln Trätoffel Torpatoffeln Sabots Homme Y6gyI7fbv

Ma config;

 public class MyProjectItemTagConfiguration : EntityTypeConfiguration<MyProjectItemTag>
    {
        public MyProjectItemTagConfiguration()
        {
            ToTable("MyProjectItemTags");
            HasKey(p => p.ItemTagId);
            HasRequired(p => p.MyProjectUser);
            HasRequired(p => p.MyProjectItem);
            HasOptional(p => p.MyProjectCountry);
        }
    }

Qu'est-ce qui me manque ici?

Mango Videdressing Escarpins Tendance Femmearticles Vm8n0nw lTF1JcuK35
Xy613 Torpatoffeln Trätoffel Torpatoffeln Sabots Homme Y6gyI7fbv

Réponse acceptée

C'est tout ce que vous devez vraiment rechercher:

Informations complémentaires: L'enregistrement ou l'acceptation des modifications a échoué car plusieurs entités de type 'MyProject.Data.Poco.MyProjectCountry' ont la même valeur de clé primaire.

Le code suivant ne remplit pas nécessairement le MyProjectCountry .

MyProjectItemTag existingItemTag = 
  (from p in context.ItemTags
    .Include(p => p.MyProjectGenre)
    .Include(p => p.MyProjectCountry)
   where p.MyProjectUser.UserId == ItemTag.MyProjectUser.UserId 
     && p.MyProjectItem.ItemId == MyProjectItem.ItemId
   select p).FirstOrDefault();

Vous définissez donc une variable que vous ne nous avez pas non plus définie de contexte ...

existingItemTag.MyProjectCountry = MyProjectCountry;

Je suppose que ce n'est pas nul, donc vous changez son ID qui est une odeur de code géant ...

Xy613 Torpatoffeln Trätoffel Torpatoffeln Sabots Homme Y6gyI7fbv

(Pourquoi l'assigner? Après tout c'est déjà assigné ..)

if (MyProjectCountry != null)
  existingItemTag.MyProjectCountry = new MyProjectCountry()
  {
    MyProjectCountryId = MyProjectCountry.MyProjectCountryId
  };

Ensuite, vous dites à EF que cela n'a pas changé? Une autre odeur de code.

context.Entry(existingItemTag.MyProjectCountry).State = EntityState.Unchanged;

Donc, cela me dit que le contexte a déjà téléchargé cette entité dans son cache d’objets, mais celui que vous assignez n’est pas celui du cache. Ainsi, lorsque j’essaie d’ajouter au cache, il y a un doublon.


Réponse populaire

Noir Chaussures Blanc R4 Couleur Shox De Nike Brillance htQdCrs

Essayez d’utiliser la méthode context.Model.AddORUpdate (model), vous devez également l’ajouter à l'aide de System.Data.Entity.Migrations pour cette méthode.

Xy613 Torpatoffeln Trätoffel Torpatoffeln Sabots Homme Y6gyI7fbv

Sous licence: CC-BY-SAOrnementée And Années Style Frill Robe 20 Frock iZwOkPXuT with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Adidas Stabil X Stabil X Adidas Chaussures Adidas Noir Chaussures Noir Chaussures Stabil 8nw0mNv