IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

Diskuze: Entity Framework a smazani obsahu DbSet?

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Martin
Člen
Avatar
Martin:6.3.2018 16:23

Ahoj, mam dalsi problem.
Snazim se nacist XML a z nej udelat uzivatelsky vstup.
Ve chvili kdy odsouhlasim vsechno a dostanu se do faze ukladani do db

db.DBContexts.Add(dBContext);
db.SaveChanges();

se vse provede jak ma, pokud ale web nevypnu, jen chci udelat dalsi upravu s jinym xml a uplne jinym klicem mi to nahlasi chybu ze klic je duplicitni.
Ted nastava problem. vsechny data jsou stale ulozena v db.DBContexts a ja nevim jak je smazat. Klasicke reseni jako u listu tedy

db.DBContexts.Clear();

nefunguje.
Nevite nekdo co s tim prosim?
Velice dekuji
M.

 
Odpovědět
6.3.2018 16:23
Avatar
Odpovídá na Martin
Marian Benčat:6.3.2018 16:46

db.DBContexts­.Add(dBContex­t);

todle mě děsí. Co jsou proměnné db.DBContexts a dBContext? Trošku doufám, že je to jen debilní pojmenování...

Každopádně z toho co vidim, vidím pravděpodobně jeden obrovský průser a sice, že sdílíš dbcontext napříč requesty ;-) To nemůžeš.. Dbcontext je identity mapa a todle ji posere tměř vždy.

Nahoru Odpovědět
6.3.2018 16:46
Totalitní admini..
Avatar
Martin
Člen
Avatar
Odpovídá na Marian Benčat
Martin:6.3.2018 16:51

db a DBCOntexts je :

public class WebApplication1Context : DbContext
{
    public WebApplication1Context() : base("name=DefaultConnection")
    {
    }

    public System.Data.Entity.DbSet<Safe.Models.DBContext> DBContexts { get; set; }

}

a pak do tohu ukldam tridu dBContext

je to defaultni pojmenovani co mi udelal EF.

a tohle

public System.Data.Entity.DbSet<Safe.Models.DBContext> DBContexts { get; set; }

je to cemu potrebuju vymazat obsah.

Zatim to zkousim, takze jsem tomu vsemu nechal dafaultni jmeno
Kazdopadne potrebuju smazat obsah DbSetu nez s tim zacnu pracovat.
To je ta podstata

Editováno 6.3.2018 16:52
 
Nahoru Odpovědět
6.3.2018 16:51
Avatar
Fenrix
Člen
Avatar
Fenrix:6.3.2018 18:08

jen teda střílim do prázdna, ale co třeba

protected override void Dispose(bool disposing)
{
    db.Dispose();
    base.Dispose(disposing);
}

edit: když nad tim tak přemýšlim tak nestřílim do prázdna, ale do nohy.. jakobych nic nenapsal :D

Editováno 6.3.2018 18:10
 
Nahoru Odpovědět
6.3.2018 18:08
Avatar
Martin
Člen
Avatar
Martin:6.3.2018 19:02

:-D tohle jsem zkousel taky, jine napady?

 
Nahoru Odpovědět
6.3.2018 19:02
Avatar
Marian Benčat:6.3.2018 19:49

Wait cože? Ty mas nějakou tabulku pojmenovanou dbcontext a tak ti vytvořil entitu dbcontext? Mne z toho co vidím přijde trošku, jako když nemáš absolutně potuchy, co vlastně delas. Sorry jako.

Nahoru Odpovědět
6.3.2018 19:49
Totalitní admini..
Avatar
Odpovídá na Martin
don.jarducius:6.3.2018 20:30

Chyba je jasná, duplicitní klíč.

Co používáš jako primární index? Máš ho vůbec definovaný?
Pokud jej XML data nepoužívají, musíš si ho přidat, např. identity sloupec (int) nebo uniqueidentity (Guid).

Pokud chceš vysypat lokální cache DbContextu, nejrychlejší je Dispose a znovuvytvoření.

Každopádně to pojmenování DbSetu je opravdu hodně hodně hodně nevhodný.

Nahoru Odpovědět
6.3.2018 20:30
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Martin
Člen
Avatar
Odpovídá na Marian Benčat
Martin:6.3.2018 20:38

moc nemam, delam to poprvy v zivote, proto zadam o radu, vysvetlovat mi, ze tomu nerozumim nema moc smysl, protoze to vim sam. a omlouvat se ve stylu agenta Burese, tedy arogantne nemusis, asi radsi nepis nic. ;)

 
Nahoru Odpovědět
6.3.2018 20:38
Avatar
Martin
Člen
Avatar
Odpovídá na don.jarducius
Martin:6.3.2018 20:49

to s duplicitnim klicem vim.
beru na vedomi ze pojemnovat to dbset neni do bucouna vhodne.

v xml je unikatni klic ktery pouzivam i jako key do tabulky .(je to asi 16ti mistny string, kombinace cisel a pismen). vzhledem k tomu, ze tenhle klic je unikatni prislo mi vhodne ho rouvnou pouzit i jako key.Pokud se tedy vyjadruji k tve otazce spravne
Popr zitra bych mohl postnout model, ktery jsem vecpal EF.

Jsem uplnej novacek a do nedavna mi programovani bylo cizi.
Proto mozna debilni otazky

 
Nahoru Odpovědět
6.3.2018 20:49
Avatar
Martin
Člen
Avatar
Odpovídá na don.jarducius
Martin:6.3.2018 20:54

Takze moje trida.
Pokud by spatne pojmenovani byl muj nejvetsi problem, tak je to vlastne v pohode.

namespace Safe.Models
{
    public class DBContext
    {
        [Key]
        public string UString { get; set; }
        public string JobName { get; set; }
        public int Index { get; set; }
        public string FileName { get; set; }
        public string Customer { get; set; }
        public string Lang { get; set; }
        public DateTime Created { get; set; }
        public string Link { get; set; }
        public string Note { get; set; }
        public bool AgreeOrNot { get; set; }
    }
}
Editováno 6.3.2018 20:56
 
Nahoru Odpovědět
6.3.2018 20:54
Avatar
Martin
Člen
Avatar
Odpovídá na Martin
Martin:6.3.2018 21:28

jeste si rikam bylo by reseni hodit to cele do using?

https://stackoverflow.com/…ect-required

 
Nahoru Odpovědět
6.3.2018 21:28
Avatar
Marian Benčat:6.3.2018 23:37

Začneme tím, že nám hodis konfiguraci dbcontextu... ideálně hod zdrojaky, nebo jejich část třeba na github, bez zdrojaku s mininal reproduction, ti tu moc lidí hádat z koule nebude

Nahoru Odpovědět
6.3.2018 23:37
Totalitní admini..
Avatar
Odpovídá na Martin
Michal Štěpánek:6.3.2018 23:41

Proč máš jako IDčko "string" a ne "int"? Jak docílíš, aby u dalšího záznamu bylo ID jiné, unikátní?

Nahoru Odpovědět
6.3.2018 23:41
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
Marian Benčat:6.3.2018 23:50

On ma idcka unikátní, jeho problém a většiny lidi co používají EF je ten, ze nemá tušení jak funguje.. Vsadim boty, ze se mu tam děje to, ze se mu v identity mapě ukryjí Added entity z předešlého webového requestu, protože ma ten context stejně staticky..

Děje se mu tam beztak jedna ze 2 věci:

  1. v jednom requestu udělá add, nezavola save, v dalším requestu udělá zase add
  2. (pravděpodobnější) XML ma v databázi, v prvním requestu ho Vráti jako disconnected entitu, v dalším requestu to chce nějak modifikovat, ale jelikož je to disconnected entita, tak se ve skutečnosti nastaví jako added, protože to nenajde v identity mapě.. = chce se ef udělat insert.
Nahoru Odpovědět
6.3.2018 23:50
Totalitní admini..
Avatar
Odpovídá na Martin
Marian Benčat:7.3.2018 0:01

Když nám ukazes kód, poradime ti za 5min. Klíčové je vědět, jestli jde tedy o web aplikaci a jak instancujes dbcontext. Podle toho uvidíme, jestli pracujes s tracked entitami, či ne.

Nahoru Odpovědět
7.3.2018 0:01
Totalitní admini..
Avatar
Martin
Člen
Avatar
Martin:7.3.2018 9:29

Ocekavam, ze prvni co mi reknete je, ze to jsou spagety :D, nebo krysi hnizdo.
Jakmile vse bude fungovat jak ma, mam v planu to udelat uhlazenejsi, hlave prehlednejsi.
Sam vim,ze je to prasarna, ale nemam zadne navyky - ty si ted buduju, takze budte prosim hodni na me :D

public WebApplication1Con­text db = new WebApplication1Con­text();

[HttpPost]
       public ActionResult Approve(DBContext dBContext, XmlReadModel xmlReadModel1)
       {

           string uString = Session["Ustring"] as string;
           XmlReadModel xmlReadModel = new XmlReadModel();
           XmlCreateModel xmlCreateModel = new XmlCreateModel();

           xmlReadModel.CertifyXML(uString);
           xmlDataList.Clear();
           xmlDataList.Add(xmlReadModel); //tohle pak udelat jinak

           if (ModelState.IsValid)
           {
               dBContext.UString = Session["Ustring"] as string;
               dBContext.Created = DateTime.Now;
               dBContext.Customer = xmlReadModel.Customer;
               dBContext.FileName = xmlReadModel.FileName;
               dBContext.Index = xmlReadModel.Index;
               dBContext.JobName = xmlReadModel.JobName;
               dBContext.Lang = xmlReadModel.Lang;
               dBContext.Link = "Not";
               dBContext.Note = xmlReadModel1.Note;
               dBContext.AgreeOrNot = true;
               db.DBContexts.Add(dBContext);
               db.SaveChanges();

               return View("Index");
           }
           else
           {
               ModelState.AddModelError(string.Empty, "Zadali jste jeden z neplatnych znaku. Nepovolene znaky jsou #$%^&*()/*-");
               return View(xmlReadModel);
           }

       }
 
Nahoru Odpovědět
7.3.2018 9:29
Avatar
Odpovídá na Martin
Michal Štěpánek:7.3.2018 11:20

a ten DBContext dBContext tam posíláš proč?
Když chci uložit nový záznam, tak si ten objekt nově vytvořím.

Nahoru Odpovědět
7.3.2018 11: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
Marian Benčat:7.3.2018 11:27

Používá zřejmě vygenerované entity jako ViewModely... proc si to tam posila, nemam tuseni, ale bude to zrejme ten problem...

Session
todle me desi.. neco mi rika, ze to bude ten problem, Martine jsi si na 100% jistý, když si to debuguješ, že ten dBContext.UString je unikatni a uz ho v DB Nemáš?

Nahoru Odpovědět
7.3.2018 11:27
Totalitní admini..
Avatar
Odpovídá na Martin
Marian Benčat:7.3.2018 11:28

Ty přicházíš z PHP viď, proto to session..

Nahoru Odpovědět
7.3.2018 11:28
Totalitní admini..
Avatar
Martin
Člen
Avatar
Odpovídá na Marian Benčat
Martin:7.3.2018 15:46

Neprichazim, nikdy pred tim jsem neprogramoval­.Testuju to na DB kterou si vzdycky smazu. Session jsem nasel nekde tady mam takovej pocit.
Me se to do db i ulozi ale problem nastava ve chvili, kdy chci udelat druhe scvhvaleni pro uplne jine XML s uplne jinym stringem. Napise mi to, ze ten puvodni string uz tam je a ze data jsou duplicitni a proste me to nenecha ulozit. Tzn ze potrebuju smazat db. , protoze data tam proste nekde visej. a pridava to tam jen dalsi. jako kdybych dal do listu add...

 
Nahoru Odpovědět
7.3.2018 15:46
Avatar
Martin
Člen
Avatar
Odpovídá na Michal Štěpánek
Martin:7.3.2018 15:49

Protoze jsou tam editovany data z view, ale konkretne to DBContext dBContext tam zustalo z drivejska, vubec by to tam nebylo potreba, data predavam z XmlReadModel xmlReadModel1.
Tak existuje neco jako db.Clear()?

 
Nahoru Odpovědět
7.3.2018 15:49
Avatar
Odpovídá na Martin
Marian Benčat:7.3.2018 15:53

je mozne hodit nekam kompletne zdrojaky? Hadam ze jako zacatecnik, na to nebudes chtit NDA?

Nahoru Odpovědět
7.3.2018 15:53
Totalitní admini..
Avatar
Odpovídá na Martin
Michal Štěpánek:7.3.2018 15:56

podle mě bys tam měl mít něco takového

if (ModelState.IsValid)
           {
                var mujobjekt = new DBContext
                {
               UString = Session["Ustring"] as string;
               Created = DateTime.Now;
               Customer = xmlReadModel1.Customer;
               FileName = xmlReadModel1.FileName;
               Index = xmlReadModel1.Index;
               JobName = xmlReadModel1.JobName;
               Lang = xmlReadModel1.Lang;
               Link = "Not";
               Note = xmlReadModel1.Note;
               AgreeOrNot = true;
                }

               db.DBContexts.Add(mujobjekt);
               db.SaveChanges();

               return View("Index");
           }
Editováno 7.3.2018 15:57
Nahoru Odpovědět
7.3.2018 15:56
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Martin
Člen
Avatar
Martin:7.3.2018 17:06

Ahoj, tak vsem zucastnenym dekuji, jsem rad za nakonec i Marian Bečva odhodil svoje vtipky a dalo se s nim bavit.Vyresil jsem to tak, ze jsem pouzil automaticky vygenerovany Controller pro EF. Tam to funguje, sice nevim proc, ale funguje i kdyz cely kod jsem bral odtamtud do sveho controlleru :D.

Kazdopadne si z toho beru ponauceni, ze DBContext jako nazev stridy pouzivat nebudu. a Zde vlozeny kod z public class DBContextsCon­troller : Controller (chtel jsem si napsat svoji cast podle nej abych aspon trosku pochopil co se tam deje, no nakonec jsem od toho upustil)
Vubec netusim v cem je rozdil

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "UString,JobName,Index,FileName,Customer,Lang,Created,Link,Note")] DBContext dBContext,XmlReadModel xmlReadModel1)
{
    XmlReadModel xmlReadModel = new XmlReadModel();
    string uString = Session["UString"] as string;
     xmlReadModel1.CertifyXML(uString);

    dBContext.UString = Session["Ustring"] as string;
    dBContext.Created = DateTime.Now;
    dBContext.Customer = xmlReadModel1.Customer;
    dBContext.FileName = xmlReadModel1.FileName;
    dBContext.Index = xmlReadModel1.Index;
    dBContext.JobName = xmlReadModel1.JobName;
    dBContext.Lang = xmlReadModel1.Lang;
    dBContext.Link = "Not";
    dBContext.Note = xmlReadModel1.Note;
    dBContext.AgreeOrNot = true;

    if (ModelState.IsValid)
    {
        db.DBContexts.Add(dBContext);
        db.SaveChanges();
        return RedirectToAction("Index","Home");
    }

    return View(dBContext);
}
 
Nahoru Odpovědět
7.3.2018 17:06
Avatar
Martin
Člen
Avatar
Martin:7.3.2018 17:07

Postupne Vam vsem nahazim aspon palce nahoru

 
Nahoru Odpovědět
7.3.2018 17:07
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 25 zpráv z 25.