Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Luboš Hnědý:11.4.2018 22:18

Zdravím mám dotaz. Jednou jsem sem již psal ale nedostalo se mi odpovědi. Pracuji ve WPF a používám Entity Framework. Můj problém je, že se snažím do databáze poslat objekt, který má ID a další různé vlastnosti, ale má i objekt a pokud dám _con.Objekty.Ad­d(VybranyObjek­t) tak mi to spadne na vyjimce An entity object cannot be referenced by multiple instances of IEntityChange­Tracker.
Předem děkuji za všechny rady a názory. :)

 
Odpovědět
11.4.2018 22:18
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Luboš Hnědý
vajkuba1234:11.4.2018 23:44

Ukaz kod, kde se ti co deje...

Nahoru Odpovědět
11.4.2018 23:44
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Luboš Hnědý:12.4.2018 7:34

Díky za odpověď. Chci přidat item do listboxu:

var modelPhoto = new ModelPhoto() {
        Name = textbox1.Text,
        Year = textbox2.Text,
        User = selectUser, // Bere z comboboxu
        User_ID = selectUser.ID
};

Dosud není žádný problém, ale když to chci poslat do db tak nastane problém.

_con.Photos.Add(modelPhoto); //Zde je chyba - An entity object cannot be referenced by multiple instances of IEntityChangeTracker
_con.SaveChanges();

Rozumím, že je to kvůli tomu, že tam posílám ojekt User.... ale nevím co s tím. Díky za každou radu

 
Nahoru Odpovědět
12.4.2018 7:34
Avatar
Odpovídá na Luboš Hnědý
Michal Štěpánek:12.4.2018 8:40

Do databáze můžeš uložit jen takový datový typ, jaký v tom sloupci má být. Předpokládám, že je to "reference" na uživatele, tak by to mělo být ID uživatele. Podle mě bys měl ten řádek

User = selectUser, // Bere z comboboxu

vyrušit. Jak vypadají sloupce té tabulky?

Nahoru Odpovědět
12.4.2018 8:40
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Luboš Hnědý:13.4.2018 9:45

Děkuji za odpověď. Rozumím tomu ale myslel jsem, že existuje nějaká metoda, která tam pošle vše ostatní kromě toho objektu. Myslel jsem, že v tom je jedna z výhod z entity frameworku, že tam mam i ty objekty ale do databaze to pak posila jenom jednoduchy datovy typy. Například když si zavolám metodu GetPhotos tak mi to vrátí jak User_ID tak i objket User z db. Model mám tkhle

[Key]
   public int ID { get; set; }

   private string _name;

   [Column("Name")]
   public string Name
   {
       get
       {
           return _name;
       }
       set
       {
           _name = value;
           NotifyPropertyChanged("Name");
       }
   }

   private int  _year;

   [Column("Year")]
   public int Year
   {
       get
       {
           return _year;
       }
       set
       {
           _year = value;
           NotifyPropertyChanged("Year");
       }
   }


   public int User_ID { get; set; }

   private User _user;

   [ForeignKey("Work_ID")]
   public virtual User User
   {
       get
       {
           return _user;
       }
       set
       {
           _user = value;
           NotifyPropertyChanged("User");
       }
   }

V db je samozřejmě sloupeček: ID, Name, Year, User_ID

 
Nahoru Odpovědět
13.4.2018 9:45
Avatar
Odpovídá na Luboš Hnědý
Michal Štěpánek:13.4.2018 9:59

Při "vytahování" údajů z DB si pomocí EF můžeš zobrazit co potřebuješ. Ale nemůžeš uložit do DB něco, o čem nemá ani ponětí a neví, co by s tím měla dělat, resp. kam to dát. Pokud máš v tabulce v DB čtyři sloupečky, tak tam prostě pět údajů nenacpeš...

Nahoru Odpovědět
13.4.2018 9:59
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Luboš Hnědý:13.4.2018 17:41

Ale mě nejde o to to tam nacpat... Nikde jsem nenapsal že tam chci posilat objekt. Ale myslel jsem, že ten entity framework má třeba nějakou metodu, která vynechá ten objekt a prostě tam pošlě jenom to ID mě je prostě jasný že to tam nepošlu s tim objektem, ale ptám se tedy jak jinak to udělat

 
Nahoru Odpovědět
13.4.2018 17:41
Avatar
Odpovídá na Luboš Hnědý
Michal Štěpánek:13.4.2018 22:20

Chápu sice, co jsi tím myslel, ale program nemůže vědět, co ty máš v podvědomí. On jenom dělá to (resp. reaguje na to), co mu napíšeš. Jestliže vytvoříš objekt, do něj něco nacpeš a pak mu dáš příkaz k uložení, tak se to prostě pokusí uložit. Pokud objekt vypadá jinak než tabulka, pak se při pokusu o uložení "pohádá" s databází, která má taky napsáno, co může uložit.
A chyba je na světě...

Nahoru Odpovědět
13.4.2018 22:20
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Luboš Hnědý:14.4.2018 0:58

Rozumim, takže EF todle neumí. Udělal jsem to tak, že si za User dosadím null a po uložení do db si tam ten objekt User zase vrátim. Asi to není úplně okej ale myslim si že se to musí dát nějak vyřešit. Ale neva díky za rady :)

 
Nahoru Odpovědět
14.4.2018 0:58
Avatar
Odpovídá na Luboš Hnědý
Michal Štěpánek:14.4.2018 13:16

Podle mě to není o EF a tom, jestli to umí nebo ne. Podle mě to všeobecně nemůže jít takto udělat. Prostě pět hodnot do čtyř sloupců neuložíš, ani kdyby ses rozkrájel.

Nahoru Odpovědět
14.4.2018 13:16
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Luboš Hnědý
sadlomaslox25:14.4.2018 15:08

To sem nepochopil, proc ti za celou diskuzi nikdo neporadil pouzit AsNoTracking(). Data pro prvni combobox nactes pomoci AsNoTracking() takze jednotlive instance nejsou sledovany EF a tyto objekty pak muzes pouzit v jinem kontextu.

 
Nahoru Odpovědět
14.4.2018 15:08
Avatar
Odpovídá na sadlomaslox25
Luboš Hnědý:16.4.2018 18:09

Moc děkuji za radu určitě to byla jedna z nejlepších :) Ale mám problém, že pokud to přidám tak se mi vytvoří nový záznam User v tabulce, což nechci...

 
Nahoru Odpovědět
16.4.2018 18:09
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.