dodání ihned! nové
Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
BF
Avatar
Richard Duchoň:29.1.2020 15:33

Mám kód který slouží k mazání položek z databáze podle toho jaký řádek je zakliknut v DataGridView. Rád bych z něj udělal void funkci abych ho mohl využívat ve více částech kódu jen za pomoci že doplnění parametr§, ale nemůžu přijít na to který parametr do toho voidu dát, abych ho následně mohl doplňovat v případě té části var RemoveItemFrom­Database - kde je použito SingleOrDefault.
Například mám dva table
Users který obsahuje - usersId a usersName
Storages který obsahuje - storagesId a storagesName
tak aby se v případě že někde napíšu

Test(Users.usersId)
{
var removeItemFromDatabases = databaseStorage.**Users**.SingleOrDefault(item => item.**usersId** == itemToRemove);
}

nebo jiný parametr, tak aby se kód změnil na toto

Test(Storages.storagesName)
{
var removeItemFromDatabases = databaseStorage.**Storages**.SingleOrDefault(item => item.**storagesName** == itemToRemove);
}

a tak dále, níže přikládám část celého kódu

public void Test(DataGridView dataGridView, string questionText, string nameOfQuestion, string nameOfCellToGetData, DatabaseStorage databaseStorage,
DbSet<DatabaseStorage> entities)
        {
            DialogResult deleteItemConfirmation = MessageBox.Show(questionText, nameOfQuestion, MessageBoxButtons.YesNo);

            if (dataGridView.SelectedRows.Count > 0)
            {
                if (deleteItemConfirmation == DialogResult.Yes)
                {
                    foreach (DataGridViewRow row in dataGridView.SelectedRows)
                    {
                        var itemToRemove = Convert.ToInt32(row.Cells[nameOfCellToGetData].Value);

                        **//var removeItemFromDatabase = entities.SingleOrDefault(item => item ==
                        //itemToRemove);**



                        //entities.Remove(removeItemFromDatabase);
                        dataGridView.Rows.RemoveAt(row.Index);
                        databaseStorage.SaveChanges();

                    }
                }
            }
        }
 
Odpovědět
29.1.2020 15:33
Avatar
Hans
Člen
Avatar
Odpovídá na Richard Duchoň
Hans:30.1.2020 8:17

Ahoj, doufám, že tomu rozumím správně

  • chceš mít jednu metodu, kde budeš mazat záznam z libovolné tabulky podle libovolného sloupce (v tvém případě int Id/string Name)?

viděl bych to na generickou fukci

void Remove<T>(Func<T, bool> func) where T : class (popř. IEntity apod.)
{
        var itemToRemove = dataStorage.Set<T>().FirstOrDefault(func);
}

Nicméně tohle řešení je celkem bastl a dobré tak na učení se doma, problém je v rozvrstvení tvého kódu. Už z těch pár řádků je vidět, že mícháš jablka a hrušky dohromady

  • DataGridView by měl být součástí prezentační vrstvy, neměl by být v kontaktu s entitami, které by se naopak neměly dostat ven z datové vrstvy (pouze jako DTO, ale tady už promlouvá moje puristická dušička)
  • používej návrhový vzor Repository, popř. UnitOfWork, ušetří ti to mimo jiné problém výše - přistupuješ pak na repozitáře pod jednotným interface a konkrétní repozitář si nainjektuješ. Někdy se říká, že DbSet = Repository a DbContext = UnitOfWork, ale nevěř tomu :-)

a další věci...

Tohle téma je dost obsáhlé na příspěvek v diskuzi, kdyžtak dodám nějaké odkazy, pokud bys chtěl (řekni si).

 
Nahoru Odpovědět
30.1.2020 8:17
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Hans
Člen
Avatar
Odpovídá na Hans
Hans:30.1.2020 8:22

edit: sorry musí tam být expression, aby si s tím poradil EF

void Remove<T>(Expression<Func<T, bool>> func) where T : class (popř. IEntity apod.)
{
        var itemToRemove = dataStorage.Set<T>().FirstOrDefault(func);
}

(jsem slepý, nebo tady není editování příspěvků?)

 
Nahoru Odpovědět
30.1.2020 8:22
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 3 zpráv z 3.