Diskuze: Vložení dat s objektem do databáze
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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
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?
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
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š...
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
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ě...
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
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.
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.
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...
Zobrazeno 12 zpráv z 12.