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.

Člen

Zobrazeno 25 zpráv z 25.
//= 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.
db.DBContexts.Add(dBContext);
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.
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
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
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.
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ý.
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.
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
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; }
}
}
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
Proč máš jako IDčko "string" a ne "int"? Jak docílíš, aby u dalšího záznamu bylo ID jiné, unikátní?
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:
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.
Ocekavam, ze prvni co mi reknete je, ze to jsou spagety , 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
public WebApplication1Context db = new WebApplication1Context();
[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);
}
}
a ten DBContext dBContext tam posíláš proč?
Když chci uložit nový záznam, tak si ten objekt nově vytvořím.
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áš?
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...
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()?
je mozne hodit nekam kompletne zdrojaky? Hadam ze jako zacatecnik, na to nebudes chtit NDA?
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");
}
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 .
Kazdopadne si z toho beru ponauceni, ze DBContext jako nazev stridy pouzivat
nebudu. a Zde vlozeny kod z public class DBContextsController : 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);
}
Zobrazeno 25 zpráv z 25.