Zabývám se teď technologiemi kolem LINQu a narazil jsem na zajímavý problém. Mějme POCO objekt, vygenerovaný z databáze pomocí toho klikacího udělátka ve Visual studiu, řekněme ZAKAZNIK. Dále, natáhneme z databáze zákazníky:
Dim MojiZakaznici as ZAKAZNIK = From zak in db.ZAKAZNIK select ZAK
Vrátí, řekněme 5 zákazníků, které nabinduji na BindingSource a toto BindingSource pak použiji jako DataSource pro, řekněme, DataGridView. Toto funguje. V DataGridView následně provedu, dejme tomu, smazání dvou řádků, tedy dvou zákazníků. V určité době pak provedu SubmitChanges nad příslušným DataContextem a pokusím se dva zákazníky smazat i v databázi. Jenomže: Díky referenční integritě se první zákazník nesmaže (má třeba objednávky) a celé SubmitChanges skončí na chybě. Otázky: 1) Lze nějak provést smazání alespoň těch položek, které by prošly? 2) Lze nějak donutit DataContext, aby zapomněl na to, že má nevyřízenou položku v Changesetu a napříště se nepokoušel DELETE provést, protože to zase neprojde? (Obávám se, že nikoli, že jediným řešením je nový datacontext). Elegantní by bylo třeba DataContext.GetChangeset().Deletes.Clear, ale kolekce změn je bohužel jen pro čtení ;-( 3) A konečně - jak elegantně donutit DataGridView, aby řádek, který nelze smazat, znovu zobrazila jako existující? Ve VB6, kde se používaly gridy třetích stran, toto samozřejmě fungovalo, neboť po smazání řádku se program vždy pokusil provést změnu i v databázi. Nicméně zde se změny "štosují" až do zavolání SubmitChanges. Neřešili jste něco podobného?
|