EntityFramework M*M vazba – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

EntityFramework M*M vazba – .NET – Fórum – Programujte.comEntityFramework M*M vazba – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
farth0
Newbie
25. 9. 2017   #1
-
0
-

Ahoj, začínám s Entity Frameworkem a zkouším si udělat databázovou filmovou knihovnu. Mám problém s vazbou M*M. Z databáze načítám / ukládám žánry , pokud tam je tak se pouze přiřadí k filmu a pokud ne tak se přidá nový do databáze. Problém se že se přidá vždycky ikdyž existuje.

using (var db = new CSFDLocalEntities1())
            {
                foreach (string genre in genres)
                {
                    Genre genreInDb = db.Genres.Where(x => x.Genre1 == genre).SingleOrDefault();
                    if (genreInDb == null)
                    {
                        film.Genres.Add(new Genre() { Genre1 = genre });
                    }
                    else
                    {
                        Genre g = new Genre { IdGenre = genreInDb.IdGenre, Genre1 = genreInDb.Genre1 };
                        film.Genres.Add(g);                    
                    }
                }

                db.Films.Add(film);
                db.SaveChanges();

            }

Třídy pro Filmy a Žánry

    public partial class Film
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Genre> Genres { get; set; }
        public Film()
        {
            this.Genres = new HashSet<Genre>();
        }
    }

    public partial class Genre
    {
        public int IdGenre { get; set; }
        public string Genre1 { get; set; }
        public virtual ICollection<Film> Films { get; set; }
        public Genre()
        {
            this.Films = new HashSet<Film>();
        }

    }


Navrh modelu

Připojen obrázek.

Při přidání filmu do databáze je přidán i žánr do tabulky žánru, přestože již v tabulce existuje. Kde by mohl být problém? Děkuji za odpověď :)

Nahlásit jako SPAM
IP: 77.236.206.–
Mutagen
~ Anonymní uživatel
549 příspěvků
25. 9. 2017   #2
-
0
-

Sice EntityFramework neznám, ale zkusil bych místo SingleOrDefault použít třeba First a zároven bych si zjistil jestli db.Genres opravdu má hodnoty co má mít. Popřípadě bych ten string otrimoval, jak z db tak ten co porovnáváš a porovnal StringComparison.InvariantCultureIgnoreCase

db.Genres.Where(x => x.Genre1 == genre).SingleOrDefault();

za

db.Genres.Where(x => Trim(x.Genre1).Equals(Trim(genre), StringComparison.InvariantCultureIgnoreCase).First();

Třeba to pomůže.

Nahlásit jako SPAM
IP: 89.190.90.–
farth0
Newbie
25. 9. 2017   #3
-
0
-

#2 Mutagen
díky za odpověď , v celku mě to  popostrčilo a navedlo správným směrem. Upravený kód vypadá tahle.

 foreach (string genre in genres)
                {
                    Genre dbGenre = db.Genres.FirstOrDefault(x => x.Genre1 == genre);
                    if (dbGenre == null)
                    {                 
                        dbGenre = new Genre() { Genre1 = genre };
                    }
                    film.Genres.Add(dbGenre);
                }
  db.Films.Add(film);
  db.SaveChanges();


Konečně to funguje. Ale proč to nefachá s tou Single to netuším.

Nahlásit jako SPAM
IP: 77.236.206.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 73 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý