NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Maros2470
Člen
Avatar
Maros2470:1.11.2016 10:32

Ahoj. Potřeboval bych poradit.

Mám v databázi tabulky Object, FireApparat, Revision a ApparatRevision.

Tabuka FireApparat je vázána na tabulku Object přes ObjectId.
Tabulka ApparatRevision je vázána na tabulku Revision přes RevisionId.
Tabulka Revision je vázána na tabulku Object přes ObjectId;

V tabulce FireApparat jsou uloženy hasící přístroje s jejich základními parametry.

Co potřebuji?

Vyberu objekt a založím novou revizi, hasící přístroje z tabulky FireApparat v tomto objektu
se mi zkopírují do tabulky ApparatRevision, kde si doplním údaje o revizi.

Nevím jak na kopírování dat.

Zkoušel jsem:

public object Apparat
{
get
{
var app = FireApparats.Whe­re(a => a.ObjectId == SelectedObjec­t?.ObjectId);
return app;
}
}

public void CopyApparat()
{
ApparatRevisi­ons.Add(Apparat);
}

Pracuji v C# WPF MVVM. Z tabulek mám vztvořeny kolekce ObservableCollec­tion<>.

Díky za rady a tipy.

 
Odpovědět
1.11.2016 10:32
Avatar
jan.pichl
Člen
Avatar
jan.pichl:1.11.2016 16:47

Nemáš problém v mělké kopiji ? get v Apparat tě nevrátí nový objekt ale odkaz na starý. Chtělo by to možná vytvorit hlubokou kopiji. Zkus MemberwiseClone

 
Nahoru Odpovědět
1.11.2016 16:47
Avatar
Odpovídá na jan.pichl
Marian Benčat:1.11.2016 23:58

Nejsem grammar nazi, ale to co vytvářís mi opravdu vypaluje oči.

Nahoru Odpovědět
1.11.2016 23:58
Totalitní admini..
Avatar
jan.pichl
Člen
Avatar
Odpovídá na Marian Benčat
jan.pichl:2.11.2016 4:57

Protože to po sobě v tom pidi editoru nečtu. A když to odešlu a vidím to tak jak to je, tak to tady nevím proč nejde editovat. Prostě ruka je někdy rychlejší než myšlenka. Ale ta "KOPIJE" se teda opravdu extrémně povedla to uznávám :)

 
Nahoru Odpovědět
2.11.2016 4:57
Avatar
Maros2470
Člen
Avatar
Odpovídá na jan.pichl
Maros2470:2.11.2016 9:29

Ahoj. Hledal jsem to na netu, ale nepochopil jak to použít v mém případě. Můžeš mi poradit?

Kolekce jsou:
ObservableCollec­tion<TFireAppa­rat> FireApparats { get; set;}
ObservableCollec­tion<TObject> Objects { get; set;}
ObservableCollec­tion<TRevision> Revisions { get; set;}
ObservableCollec­tion<TApparat­Revision> ApparatRevisionss { get; set;}

využívám EF 6.

Díky

 
Nahoru Odpovědět
2.11.2016 9:29
Avatar
Maros2470
Člen
Avatar
Odpovídá na jan.pichl
Maros2470:2.11.2016 9:30

Později budu řešit ještě Cut, Copy a Paste

 
Nahoru Odpovědět
2.11.2016 9:30
Avatar
Marian Benčat:2.11.2016 10:18

Tvuj problem nema nic spolecneho s kolekcemi a uz vubec ne s WPF. Je to ciste o tom jak kopirovat data pomoci EF. A doporucuju nepouzivat zadny automaticky deep copy mechanismy ale udelat to poctive rucne..

Tedy proste na hloupo udelat:

db.Necos.add(new Neco{
Name = old.Name,
LastName = old.LastName
});

atd.

Nahoru Odpovědět
2.11.2016 10:18
Totalitní admini..
Avatar
Maros2470
Člen
Avatar
Odpovídá na Marian Benčat
Maros2470:2.11.2016 10:32

Zkoušel jsem to takto, ale taky nic:

public void CloneApparat()
{
var x = context.TFire­Apparats.AsNo­Tracking().Whe­re(a => a.TLocation.TOb­ject.ObjectId == 2);
context.TAppa­ratRevisions.Ad­d(x);
}
Ale je tam výjimka u proměnné x:

Nejde převést z System.Linq.I­Queryable<Hasí­cí_přístroje.Mo­dels.TFireAppa­rat> na Hasící_přístro­je.Models.TAp­paratRevision.

 
Nahoru Odpovědět
2.11.2016 10:32
Avatar
jan.pichl
Člen
Avatar
jan.pichl:2.11.2016 10:50

tady to máš

https://csharp.2000things.com/tag/deep-copy/

Jde o to že pro datové typy které se nepředávají hodnotou jako je třeba (integer) ale odkazem jako je třeba class, je pro vytvoření jejich hluboké kopie nutné vytvořit objekt nový se shodnýma parametrama. Ovšem je třeba dát pozor na to že pokud jsou jakoby zanořené do sebe další a další tak pro úplnou hlubokou kopii musíš vytvářet nové objekty i na všechny zanořené objekty předávané odkazem.

Představ si to jako když máš třeba krabici s kuličkama. můžeš ji položit na jedno místo (objekt v paměti) a všem komu potřebuješ řekneš kde je (předáš referenci) a od teď každý kdo ví kde je může s těma kuličkama manipulovat(při­dat,ubrat,nat­řít) ale všichni mění pořád ty kuličky ve stejné krabici na stejném nístě.

Naproti tomu hodnotou znamená že každému dáš svojí vlastní krabici s kuličkama a potom ale nikdo z ostatních nemůže mannipulovat s krabicí někoho jiného protože neví kde jsou. A tím je dané že ve finále můž každá krabice mít jiný obsah.

A ješte se ti může stát že každému dáš sice svojí krabici s kuličkama, ale do každé krabice vložíš lísteček s textem červená kulička je ve sklepě. Potom každý má všechny kuličky svoje vlastní kromě té jedné, která je ve sklepě a je společná pro všechny. No a když chceš aby měl každý i tu kuličku ve sklepě vlastní tak ji vytvoříš novou.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
2.11.2016 10:50
Avatar
Odpovídá na jan.pichl
Marian Benčat:2.11.2016 11:21

Ja bych mu nejradeji poradil, at se na to vykasle a executne radeji SQLko.. Protoze to v EF budto udela na hovno a nebude to fungovat (nedá si pozor na FKcka, na cyklicke reference LIST->Parent object, na change tracking, narusi optimistic coherency a dalsi veci).

Nahoru Odpovědět
2.11.2016 11:21
Totalitní admini..
Avatar
Maros2470
Člen
Avatar
 
Nahoru Odpovědět
3.11.2016 6:33
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 11 zpráv z 11.