Avatar billede simpa Nybegynder
22. februar 2013 - 00:03 Der er 4 kommentarer

update many to many entity framework error: Multiplicity constraint violated. The role 'x' of the relationship 'many_many_relation_ibfk_2' has multiplicity 1 or 0..1.

Jeg har nu prøvet at updatere en mange til mange men uden held har dette kode indtil videre...

public static void OpdaterUdlejning(Udlejning u, Dictionary<string, bool> vu, List<ExtendedGasAntalVognIds> pu)
        {
            using (var context = new CampingForumEntities1())
            {
                Udlejning udl = context.Udlejnings.FirstOrDefault(d => d.UdlejningId == u.UdlejningId);//Old
                               
                //List<vogn_udlejning> vuList = udl.vogn_udlejning.ToList();
                List<vogn_udlejning> newvuList = new List<vogn_udlejning>();
                ////List<produkt_udlejning> puList = udl.produkt_udlejning.ToList();
                List<produkt_udlejning> newpuList = new List<produkt_udlejning>();

                udl.produkt_udlejning.Clear();
                udl.vogn_udlejning.Clear();

                //foreach (vogn_udlejning vui in vuList)
                //{
                //    //context.vogn_udlejning.Attach(vui);
                //    //context.vogn_udlejning.Remove(vui);

                //    ((IObjectContextAdapter)context).ObjectContext.Detach(vui);
                //    context.Entry(vui).State = System.Data.EntityState.Modified;
                //}

                //foreach (produkt_udlejning pui in puList)
                //{
                //    //context.produkt_udlejning.Attach(pui);
                //    //context.produkt_udlejning.Remove(pui);

                //    ((IObjectContextAdapter)context).ObjectContext.Detach(pui);
                //    context.Entry(pui).State = System.Data.EntityState.Modified;
                //}




                if (u != null)
                {
                    foreach (ExtendedGasAntalVognIds egavi in pu)
                    {
                        if (egavi.gasKg != "0")
                            u.produkt_udlejning.Add(new produkt_udlejning
                              {
                                  Antal = egavi.antal,
                                  produkt_id = context.Produkters.Where(g => g.Type == egavi.gasKg && g.CategoryId == 1).FirstOrDefault().id,
                                  Produkter = context.Produkters.Where(g => g.Type == egavi.gasKg && g.CategoryId == 1).FirstOrDefault(),
                                  udlejning_id = u.UdlejningId,
                                  Udlejning = u,
                                  VognIds = egavi.vognIds
                              });
                            //context.produkt_udlejning.Attach(new produkt_udlejning
                            //{
                            //    Antal = egavi.antal,
                            //    produkt_id = context.Produkters.Where(g => g.Type == egavi.gasKg && g.CategoryId == 1).FirstOrDefault().id,
                            //    Produkter = context.Produkters.Where(g => g.Type == egavi.gasKg && g.CategoryId == 1).FirstOrDefault(),
                            //    udlejning_id = u.UdlejningId,
                            //    Udlejning = u,
                            //    VognIds = egavi.vognIds
                            //});

                        newpuList.Add(new produkt_udlejning
                        {
                            Antal = egavi.antal,
                            produkt_id = context.Produkters.Where(g => g.Type == egavi.gasKg && g.CategoryId == 1).FirstOrDefault().id,
                            Produkter = context.Produkters.Where(g => g.Type == egavi.gasKg && g.CategoryId == 1).FirstOrDefault(),
                            udlejning_id = u.UdlejningId,
                            Udlejning = u,
                            VognIds = egavi.vognIds
                        });

                            //udl.produkt_udlejning.Add(new produkt_udlejning
                            //{
                            //    Antal = egavi.antal,
                            //    produkt_id = context.Produkters.Where(g => g.Type == egavi.gasKg && g.CategoryId == 1).FirstOrDefault().id,
                            //    Produkter = context.Produkters.Where(g => g.Type == egavi.gasKg && g.CategoryId == 1).FirstOrDefault(),
                            //    udlejning_id = u.UdlejningId,
                            //    Udlejning = u,
                            //    VognIds = egavi.vognIds
                            //});
                    }

                    OpdaterUdlejningProduktUdlejning(newpuList, udl.UdlejningId);

                    //context.Entry(u.produkt_udlejning).State = System.Data.EntityState.Modified;
                    //context.Entry(puList).CurrentValues.SetValues(u.produkt_udlejning);

                    var vogne = context.Vogns.Where(v => vu.Keys.Contains(v.Nummerplade)).ToList();

                    foreach (Vogn v in vogne)
                    {

                        bool NrpladeFortelt = vu.FirstOrDefault(k => k.Key == v.Nummerplade).Value;

                        if (NrpladeFortelt)
                        {
                            u.vogn_udlejning.Add(new vogn_udlejning
                            {
                                Vogn = v,
                                vogn_id = v.Id,
                                Udlejning = u,
                                udlejning_id = u.UdlejningId,
                                Fortelt = NrpladeFortelt
                            });

                            //context.vogn_udlejning.Attach(new vogn_udlejning
                            //{
                            //    Vogn = v,
                            //    vogn_id = v.Id,
                            //    Udlejning = u,
                            //    udlejning_id = u.UdlejningId,
                            //    Fortelt = NrpladeFortelt
                            //});

                            newvuList.Add(new vogn_udlejning
                            {
                                Vogn = v,
                                vogn_id = v.Id,
                                Udlejning = u,
                                udlejning_id = u.UdlejningId,
                                Fortelt = NrpladeFortelt
                            });

                            //udl.vogn_udlejning.Add(new vogn_udlejning
                            //{
                            //    Vogn = v,
                            //    vogn_id = v.Id,
                            //    Udlejning = u,
                            //    udlejning_id = u.UdlejningId,
                            //    Fortelt = NrpladeFortelt
                            //});
                        }
                        else
                        {
                            u.vogn_udlejning.Add(new vogn_udlejning
                            {
                                Vogn = v,
                                vogn_id = v.Id,
                                Udlejning = u,
                                udlejning_id = u.UdlejningId,
                                Fortelt = NrpladeFortelt
                            });

                            //context.vogn_udlejning.Attach(new vogn_udlejning
                            //{
                            //    Vogn = v,
                            //    vogn_id = v.Id,
                            //    Udlejning = u,
                            //    udlejning_id = u.UdlejningId,
                            //    Fortelt = NrpladeFortelt
                            //});

                            newvuList.Add(new vogn_udlejning
                            {
                                Vogn = v,
                                vogn_id = v.Id,
                                Udlejning = u,
                                udlejning_id = u.UdlejningId,
                                Fortelt = NrpladeFortelt
                            });

                            //udl.vogn_udlejning.Add(new vogn_udlejning
                            //{
                            //    Vogn = v,
                            //    vogn_id = v.Id,
                            //    Udlejning = u,
                            //    udlejning_id = u.UdlejningId,
                            //    Fortelt = NrpladeFortelt
                            //});
                        }
                    }

                    OpdaterUdlejningVognUdlejning(newvuList, udl.UdlejningId);

                    //((System.Data.Entity.Infrastructure.IObjectContextAdapter)udl).ObjectContext.Detach(vu2);
                    //context.Entry(vu2).State = System.Data.EntityState.Modified;
                   
                                       

                    u.UdlejningId = udl.UdlejningId;
                    context.Entry(udl).CurrentValues.SetValues(u);
                    //context.Entry(puList).CurrentValues.SetValues(newpuList);
                    //context.Entry(vuList).CurrentValues.SetValues(newvuList);
                   
                   
                    context.SaveChanges();
                }
               
            }
        }

        public static void OpdaterUdlejningVognUdlejning(List<vogn_udlejning> vuList, int uid)
        {
            using (var context = new CampingForumEntities1())
            {
                var udlVu = context.Udlejnings.Include("vogn_udlejning").FirstOrDefault(d => d.UdlejningId == uid);//Old
               
                udlVu.vogn_udlejning.Clear();

                foreach (vogn_udlejning vu in vuList)               
                    udlVu.vogn_udlejning.Add(vu);

                context.SaveChanges();
            }
        }

        public static void OpdaterUdlejningProduktUdlejning(List<produkt_udlejning> puList, int uid)
        {
            using (var context = new CampingForumEntities1())
            {
                var udlPu = context.Udlejnings.Include("produkt_udlejning").FirstOrDefault(d => d.UdlejningId == uid);//Old
                List<produkt_udlejning> tempList = udlPu.produkt_udlejning.ToList();

                udlPu.produkt_udlejning.Clear();

                foreach (produkt_udlejning pu in puList)
                {
                    //context.produkt_udlejning.Attach(pu);
                    //context.Entry(pu).State = System.Data.EntityState.Modified;
                    udlPu.produkt_udlejning.Add(pu);
                }         

                    context.SaveChanges();               
            }
        }
Avatar billede Syska Mester
22. februar 2013 - 17:45 #1
Der er jo en masse kode. Men hvad er det som ikke virker, det synes jeg ikke fremgår ...

Ved en mange til mange i EF, har du ikke direkte adgang til den table via kode, i hvert fald ikke ved EF ... ved ikke lige hvad version du bruger. Lader til at du bruger den gamle og efter mening trælse udgave af EF. Alt for mange fejl i den.

Men hvis du kan lave et simpelt eksempel hvor det ikke virker, er det nok nemmere at hjælpe.
Avatar billede simpa Nybegynder
22. februar 2013 - 18:34 #2
Ja jeg fik jo den ide at opdatere en udlejning og alle dens ændringer på en gang. .. det er ef 4.4 jeg bruger. Fejl meddelelse n står i starten af denne tråd med stort...opdatere jeg bare udlejning en fungere det fint men dens mange til mange vil den ikke gemme. .. der er meget af koden som er udkommenteret bare for at prøve om den vil opdatete..  fejlen opstår i den nederste hjælpemetode.... ved context.savechanges (); ved produkt udlejning.  Jeg har googlet en del og fundet nogle eksempler og blev inspireret af det som du kan se jeg clear alle produkter og vogne og laver nye og prøver tilføje dem.... indtil videre har jeg fået 2 slags fejl at jeg ikke kan tilføje objekt fordi den allerede findes i objektmanageren og den anden nævnt i starten af tråden. En anden ting jeg opdagede var at den fejl den kommer med nu fordi jeg har brugt code first...og har fundet nogle forslag ved at indsætte kode i context klassen og det ville fungere men jeg ved ikke i mit tilfælde...

Der er jo anden alternativ til dette at ændre en efter en og ikke alle på en gang...

Hvad synes du?
Avatar billede Syska Mester
22. februar 2013 - 20:08 #3
Jeg ville tage de enkelte ud og opdatere dem.

og derefter "SaveChanges".

Din kode er svær at læse pga dine klasse navne med små og underscore. Det er en træls konvention du har valgt :-)

Det er ikke til at se forskel på klasser, variable, properties etc. når man ikke i forvejen kender koden.

Men ...
Hvis du kender ID'er på hvad du skal opdatere, kan du ikke bare tage dem ud og så opdatere ...

mvh
Avatar billede simpa Nybegynder
27. februar 2013 - 00:25 #4
Jeg valgte denne løsning:

public static void TilføjVognUdlejning(vogn_udlejning vu)
        {
            using (var context = new CampingForumEntities1())
            {
                //((IObjectContextAdapter)context).ObjectContext.Detach(vu);

                context.vogn_udlejning.Attach(vu);
                context.SaveChanges();
            }
        }

        //public static void FjernVognUdlejning(Udlejning u, vogn_udlejning vu)
        //{
        //    using (var context = new CampingForumEntities1())
        //    {
        //        context.vogn_udlejning.Remove(vu);

        //        context.Udlejnings.Add(u);
        //        context.SaveChanges();
        //    }
        //}

        public static void OpdaterProduktUdlejning(produkt_udlejning pu)
        {
            using (var context = new CampingForumEntities1())
            {
                //((IObjectContextAdapter)context).ObjectContext.Detach(pu);
               
                context.produkt_udlejning.Attach(pu);
                context.SaveChanges();
            }     
        }
       
        public static void OpdaterUdlejning(Udlejning u, Dictionary<string, bool> vu, List<ExtendedGasAntalVognIds> pu)
        {
            using (var context = new CampingForumEntities1())
            {
                if (u != null)
                {
                    Udlejning udl = context.Udlejnings.FirstOrDefault(d => d.UdlejningId == u.UdlejningId);//Old

                    udl.produkt_udlejning.Clear();
                    u.produkt_udlejning.Clear();
                    udl.vogn_udlejning.Clear();
                    u.vogn_udlejning.Clear();

                    u.UdlejningId = udl.UdlejningId;
                    context.Entry(udl).CurrentValues.SetValues(u);
                    context.SaveChanges();

                    //List<vogn_udlejning> vuList = udl.vogn_udlejning.ToList();
                    //List<produkt_udlejning> puList = udl.produkt_udlejning.ToList();

                    List<vogn_udlejning> newvuList = new List<vogn_udlejning>();
                    List<produkt_udlejning> newpuList = new List<produkt_udlejning>();

               
                    foreach (ExtendedGasAntalVognIds egavi in pu)
                    {
                        if (egavi.gasKg != "0")
                            newpuList.Add(new produkt_udlejning
                            {
                                Antal = egavi.antal,          //AsNoTracking()
                                produkt_id = context.Produkters.AsNoTracking().Where(g => g.Type == egavi.gasKg && g.CategoryId == 1).FirstOrDefault().id,
                                Produkter = context.Produkters.AsNoTracking().Where(g => g.Type == egavi.gasKg && g.CategoryId == 1).FirstOrDefault(),
                                udlejning_id = u.UdlejningId,
                                Udlejning = u,
                                VognIds = egavi.vognIds
                            });
                    }

                 
                    foreach (produkt_udlejning newpu in newpuList)
                    {
                        //u.produkt_udlejning.Add(newpu);
                        //OpdaterProduktUdlejning(newpu);
                        context.Database.ExecuteSqlCommand("insert into produkt_udlejning(produkt_id, udlejning_id, Antal, VognIds) values(" + "@produkt_id" + "," + "@udlejning_id" + "," + "@Antal" + "," + "@VognIds" + ")",
                            new SqlParameter("produkt_id", newpu.produkt_id), new SqlParameter("udlejning_id", newpu.udlejning_id), new SqlParameter("Antal", newpu.Antal), new SqlParameter("VognIds", newpu.VognIds));
                    }

                                //context.Vogns.AsNoTracking().Where(v => vu.Keys.Contains(v.Nummerplade)).ToList();
                    var vogne = context.Vogns.Where(v => vu.Keys.Contains(v.Nummerplade)).ToList();

                    foreach (Vogn v in vogne)
                    {
                        bool NrpladeFortelt = vu.FirstOrDefault(k => k.Key == v.Nummerplade).Value;
                       
                        newvuList.Add(new vogn_udlejning
                        {
                            Vogn = v,
                            vogn_id = v.Id,
                            Udlejning = u,
                            udlejning_id = u.UdlejningId,
                            Fortelt = NrpladeFortelt
                        });
                    }

                   
                    foreach (vogn_udlejning newvu in newvuList)
                    {
                        //u.vogn_udlejning.Add(newvu);
                        //TilføjVognUdlejning(newvu);
                        context.Database.ExecuteSqlCommand("insert into vogn_udlejning(vogn_id, udlejning_id, Fortelt) values(" + "@vogn_id" + "," + "@udlejning_id" + "," + "@Fortelt" + ")",
                            new SqlParameter("vogn_id", newvu.vogn_id), new SqlParameter("udlejning_id", newvu.udlejning_id), new SqlParameter("Fortelt", newvu.Fortelt));
                    }
                }
            }
        }


og grunden var for at undgå nogle af disse fejl:

/*
* errors occured
* 1. An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
* 2. update many to many entity framework error: Multiplicity constraint violated. The role 'x' of the relationship 'many_many_relation_ibfk_2' has multiplicity 1 or 0..1.
* 3. An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
*/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester