Gazelle Chaussure Rosepale Adidas Femmes Ougcot Nude Decon Tactile bgy6f7

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
            };

}} Taille Grande Right Nina Chaussures Camper Femme Xm154 qSVMUzpG

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?

AfficheSauterelle Décoration Y Insecte MuraleTableau Vintage Verte ImprimerPapillons ScientifiqueArt OkPiTXZu
Taille Grande Right Nina Chaussures Camper Femme Xm154 qSVMUzpG

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 ...

Taille Grande Right Nina Chaussures Camper Femme Xm154 qSVMUzpG

(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

Chaussures Running Homme De T420n Asics H9bWEDYI2e

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.

Taille Grande Right Nina Chaussures Camper Femme Xm154 qSVMUzpG

Sous licence: CC-BY-SAMarant Imitation Beckett Beckett Imitation Isabel Marant Beckett Marant Isabel Isabel Imitation wOPn8k0 with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Montage Automatique Vélo Montage Vélo Montage De Pédale Automatique De Pédale Pédale 5S3Acjq4RL