LINQ to SQL   otázka

C#, ASP.NET WebForms, LINQ

No, používám jej na první velký projekt a zatím mi práci moc nezjednodušilo. Momentálně bych potřeboval poradit s tímto:

Mám stránku, která slouží zároveň pro Update i Insert dat, podle toho, jakou operaci specifikujeme v PathInfo.

Kód pro Update vypadá takto:

case "edit":
                int articleID = int.Parse(UrlValues[1]);
                Article toUpdate = new Article();
                toUpdate.Title = txtTitle.Text;
                toUpdate.Perex = txtPerex.Text;
                toUpdate.Body = rteBody.Content;
                toUpdate.CategoryID = int.Parse(ddlCategories.SelectedValue);
                toUpdate.AddedBy = HttpContext.Current.User.Identity.Name;
                toUpdate.AddedDate = DateTime.Now;
                toUpdate.ReleaseDate = (txtReleaseDate.Text != "") ?
                    DateTime.Parse(txtReleaseDate.Text) :
                    DateTime.Now;
                toUpdate.ExpireDate = (txtExpireDate.Text != "") ?
                    DateTime.Parse(txtExpireDate.Text) :
                    DateTime.MaxValue;
                toUpdate.OnlyForUsers = chkUsersOnly.Checked;
                toUpdate.CommentsEnabled = chkEnableComms.Checked;
                toUpdate.Tags = txtTags.Text;
                DataProvider.Articles.UpdateArticle(articleID, toUpdate);
                lblResponse.ForeColor = Color.Green;
                lblResponse.Text = "Článek byl úspěšně uložen";
                break;

A komunikace s LINQ to SQL takto:

DBDataContext db = new DBDataContext(
                    cstring);
                Article toUpdate = db.Articles.Single(
                    a => a.ArticleID == articleID);
                toUpdate.Body = theArticle.Body;
                toUpdate.CategoryID = theArticle.CategoryID;
                toUpdate.CommentsEnabled = theArticle.CommentsEnabled;
                toUpdate.ExpireDate = theArticle.ExpireDate;
                toUpdate.OnlyForUsers = theArticle.OnlyForUsers;
                toUpdate.Perex = theArticle.Perex;
                toUpdate.ReleaseDate = theArticle.ReleaseDate;
                toUpdate.Tags = theArticle.Tags;
                toUpdate.Title = theArticle.Title;
                db.SubmitChanges();

Nicméně update neproběhne. Data v databázi zůstávají stejná. za každou radu budu vděčný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nějak nechápu, jak ten váš kód funguje.

V případě, že editujete záznam, tak správné schéma je ta vaše druhá ukázka - vytáhnu si ten objekt z databáze, změním mu hodnoty a zavolám SubmitChanges.

Není mi ale jasné, proč v první ukázce vytváříte nový Article, do nějž ta data vkládáte, a ten si pak předáváte do metody UpdateArticle. Chápu, že se asi nějak snažíte oddělit datovou vrstvu a ovládání komponent, pak bych to ale řešil takto:

1.) V datové vrstvě udělat metodu GetArticle, která vrátí objekt Article podle ID.

2.) V datové vrstvě udělat metodu UpdateArticle, do níž dát předávat článek, ale nechat v ní jen dc.SubmitChanges. Časem se taková metoda může hodit, při změně článku budete chtít třeba poslat e-mail nebo tak něco.

3.) V kódu stránky při editaci pak si pomocí GetArticle vytáhnout správný objekt Article, pak jej naplnit z komponent, a předat ho metodě UpdateArticle.

Jinak ten kód pro naplnění komponent z objektu a naplnění objektu z komponent, který ve stránce máte, toho se dá relativně elegantně zbavit pomocí databindingu. Protože je to docela hezké téma, napíšu o tom v nejbližších dnech článek.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback