BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

Windows 7 Ultimate nemokamai #2 – laimėtojas paaiškėjo

Parašė Sergejus | 2010-06-30 23:17

Taigi pasibaigė mėnuo, o tai reiškia, kad antrą Windows 7 Ultimate diską laimėjo…

random

…skaitytojas vardu Edmundas M. Prašau susisiekti su manimi el. paštu (ar parašykite savo) ir aš perduosiu prizą. Nenusiminkite kam nepasisekė, nes jau nuo rytojaus turėsite šansą laimėti antrą Windows 7 Ultimate DVD diską.

Rodyk draugams

Lietuvos .NET vartotojų grupės susitikimai #10 Vilniuje ir #7 Kaune - atnaujinta

Parašė Sergejus | 2010-06-28 09:03

Šį kartą ne visai standartinė tema ir ne visai standartinis formatas. Kalbėsime apie projektų valdymą naudojant Scrum bei kaip jį įdiegti Jūsų įmonėje. Pristatymą darys http://scrum.agile.lt tinklaraščio autorius, Adform projektų vadovas ir Product Owner, Vaidas Adomauskas, kuris ne tik praktiškai taiko šią metodologiją, bet ir aktyviai skatina tai daryti kitus. Po pristatymo - diskusija: "Do or not to do Scrum".

Susitikimai vyks Vilniuje - birželio 29 d. (viešbutyje Crowne Plaza), Kaune - liepos 1 d. (Technopolis, Microsoft Inovacijų Centras).

18:00 - 19:30 - "Realus Scrum naudojimas įmonėse: teorija, praktinė patirtis iš 2 kompanijų, sunkumai, rekomendacijos", Vaidas Adomauskas, Scrum Master, http://scrum.agile.lt
19:30 - 20:30 - Do or not to do Scrum
20:30 - Vakarinė dalis

Paskutiniu metu pastebėjau, kad nemažai žmonių registruojasi, tik kad rezervuoti vietą. Dėl šios priežasties laisvos vietos greitai pasibaigia ir kiti, kas tikrai nori ateiti, nebegali to padaryti. Labai prašau registruotis tik tuo atveju, jei tikrai planuojate ateiti.

Registracija: Vilniuje / Kaune.

P.S. Kadangi renginys yra iš projekto valdymo, labai prašau perduokite informaciją apie renginį ir jūsų projektų vadovams.

Rodyk draugams

Windows 7 Ultimate nemokamai #2

Parašė Sergejus | 2010-06-16 20:46

IMG_0088

Taisyklės:

Šio straipsnio komentaruose parašykite savo vardą ir pavardę arba slapyvardį. Kiekvieno mėnesio 15-ą bei paskutinę dieną atsitiktine tvarka išrinksiu vieną nugalėtoją, kuriam ir atiteks dovana. Kompaktą galėsiu perduoti tik VILNIUJE ir KAUNE. Jeigu esate iš kito miesto – teks patiems atvažiuoti į Vilnių.

Jeigu akcija patinka, nepamirštame paspausti ‘Patiko

Rodyk draugams

Windows 7 Ultimate nemokamai #1 – laimėtojas paaiškėjo

Parašė Sergejus | 2010-06-15 20:55

Taigi šiandien jau 15 mėnesio diena, o tai reiškia, kad pirmą Windows 7 Ultimate diską laimėjo…

image

…skaitytojas slapyvardžiu AUGiS. Prašau susisiekti su manimi ir aš perduosiu prizą. Nenusiminkite kam nepasisekė, nes jau nuo rytojaus turėsite šansą laimėti antrą Windows 7 Ultimate DVD diską.

Rodyk draugams

LINQ to SQL meistriškumo klasė #3 (DataContext išvalymas)

Parašė Sergejus | 2010-06-14 22:15

Kaip žinia, LINQ to SQL duomenų kontekstas seka visus esybės pakeitimus, kuriuos mes atliekame. Tai yra labai naudinga galimybė, bet kartais tenka atsisakyti visų laukiamų pakeitimų (pavyzdžiui, nepraėjus validavimui). Paprasčiausias būdas išvalyti duomenų kontekstą – tiesiog sukurti naują. Tai veikia, bet pasitaiko atvejų, kai reikia išvalyti duomenų kontekstą ir toliau su juo dirbti. Būtent tokiai situacijai egzistuoja viešai neprieinamas DataContext metodas ClearCache, kurį mes galime pasiekti naudojant refleksiją (angl. reflection):

public static void ClearCache(this DataContext context)
{
    const BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
    context.GetType().GetMethod("ClearCache", flags).Invoke(context, null);
} 


Žemiau pateiktame kode matyti, kaip galima atsisakyti kategorijos pavadinimo pakeitimų:

static void Main(string[] args)
{
    using (var db = new DemoDataContext())
    {
        db.Log = Console.Out;

        var category = db.Categories.First();
        Console.WriteLine(category.Name);

        category.Name = "Testuojame";
        db.ClearCache();

        db.SubmitChanges();
        category = db.Categories.First();
        Console.WriteLine(category.Name);
    }

    Console.ReadKey();
}

image

ClearCache metodą jus galite rasti ir mano SBToolkit projekte.

Rodyk draugams

LINQ to SQL meistriškumo klasė #2 (Attach/Detach kurie veikia)

Parašė Sergejus | 2010-06-06 13:14

Kaip žinia, didžiausias (bent jau man) LINQ to SQL apribojimas – normalaus Attach/Detach mechanizmo nebuvimas. Kai kurie gali pradėti prieštarauti – bet gi yra Attach! Taip jis yra, bet jis neveikia kaip turėtų veikti. Šiame straipsnyje aš parodysiu neidealų, bet veikiantį LINQ to SQL Attach/Detach sprendimą.

Pirmas mitas – Attach/Detach reikalauja TimeStamp tipo stulpelio lentelėje. Tikrai ne, savo pavyzdyje aš naudosiu modelį iš pirmos dalies:

image

Kaip žinia, Detach metodas skirtas atrišti esybę nuo duomenų konteksto, o savo ruožtu Attach metodas – atvirkščiai pririšti. Žemiau pateiktas kodas, kuris logiškai turėtų veikti, bet, deja, LINQ to SQL neveikia:

static void Main(string[] args)
{
    Post post;

    using (var db = new DemoDataContext())
    {
        post = db.Posts.First();
    }

    post.Title = "Testuojame";

    using (var db = new DemoDataContext())
    {
        db.Posts.Attach(post, true);
        db.SubmitChanges();
    }

    Console.ReadKey();
}

Vietoje Detach metodo aš naudoju using bloką, o Attach metodui išreikštinai nusakau, kad mano objektas buvo prieš tai modifikuotas. Atrodytų viskas gerai, bet vykdymo metu gausite klaidą: An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported. Internete vieni siūlo pridėti TimeStamp stulpelį, kiti siūlo dar kitus sprendimus. Tam kad tiksliai išsiaiškinti problemos priežastį, sugaišau virš dienos, bet dabar galiu pasidalinti su jumis. Problema atsiranda, kai jūsų objektas turi ryšius į kitus (tėvinį ar vaikinius) objektus. Mano atveju, objektas post turi savybę Category. Po using panaudojimo, pasirodo ne visai korektiškai išsivalo šios savybės (priminsiu, jos yra EntitySet arba EntityRef tipo), dėl ko ir atsiranda klaida kviečiant Attach metodą.

Problema aiški – reikia išvalyti tėvinius ir vaikinius objektus. Klausimas – kaip? Internete pavyko rasti kelis būdus, bet visi reikalavo pakankamai daug rankinio darbo (ko aš labai nemėgstu). Perskaitęs dešimtis įvairiausių straipsnių, agregavus visus duomenis bei galimus sprendimų variantus, apsistojau ties tokiu:

DBML dizaineryje nustatome, kad mūsų esybės gali būti serializuojamos:

image

Aprašome tokią pagalbinę klasę Detacher:

internal static class Detacher
{
    public static TEntity Detach<TEntity>(TEntity entity)
    {
        return Deserialize<TEntity>(Serialize(entity));
    }

    private static string Serialize<TEntity>(TEntity entity)
    {
        using (var stringWriter = new StringWriter())
        {
            using (var xmlWriter = XmlWriter.Create(stringWriter))
            {
                var serializer = new DataContractSerializer(typeof(TEntity));
                serializer.WriteObject(xmlWriter, entity);
            }
            return stringWriter.ToString();
        }
    }

    private static TEntity Deserialize<TEntity>(string entity)
    {
        using (var stringReader = new StringReader(entity))
        using (var reader = XmlReader.Create(stringReader))
        {
            var serializer = new DataContractSerializer(typeof(TEntity));

            return (TEntity)serializer.ReadObject(reader);
        }
    }
}

Bei kad natūraliau atrodytų – praplėtimo metodą Detach:

static class Extensions
{
    public static TEntity Detach<TEntity>(this DataContext db, TEntity entity)
        where TEntity : class
    {
        return Detacher.Detach(entity);
    }
}

Dabar atnaujinam mūsų pradinį pavyzdį pridedant vieną eilutę:

static void Main(string[] args)
{
    Post post;

    using (var db = new DemoDataContext())
    {
        post = db.Posts.First();
    }

    post.Title = "Testuojame";

    using (var db = new DemoDataContext())
    {
        post = db.Detach(post);
        db.Posts.Attach(post, true);
        db.SubmitChanges();
    }

    Console.ReadKey();
}

Staiga viskas pradeda veikti! Bet ne viskas taip gražu, kaip gali atrodyti iš pirmo žvilgsnio. Šis metodas turi vieną svarbų ribojimą – po Detach metodo iškvietimo, jus neturėsite Lazy Loading galimybės. Kaip pavyzdys, aukščiau pateiktame kode savybė Category bus visada NULL. Jeigu jums vis dėlto reikia ją pasiekti – pasinaudokite Include metodu iš praeito straipsnio:

static void Main(string[] args)
{
    Post post;

    using (var db = new DemoDataContext())
    {
        post = db.Posts.Include(p => p.Category).First();
    }

    Console.WriteLine(post.Category.Name);

    post.Title = "Testuojame";

    using (var db = new DemoDataContext())
    {
        post = db.Detach(post);
        db.Posts.Attach(post, true);
        db.SubmitChanges();
    }

    Console.ReadKey();
}

Nepaisant minėto apribojimo, per du metus intensyvaus darbo su LINQ to SQL nieko geresnio man sugalvoti nepavyko. Iš kitos pusės, Include ir Detach/Attach metodai man leidžia be problemų kurti tikrai dideles aplikacijas, kur LINQ to SQL naudojamas tiek Web, tiek WCF, tiek Windows dalyse.

Visą kodą jus galite rasti mano SBToolkit projekte.

Rodyk draugams

Windows 7 Ultimate nemokamai #1

Parašė Sergejus | 2010-06-01 17:42

Kaip Lietuvos .NET vartotojų grupės lyderis, prieš savaitę gavau penkis Windows 7 Ultimate kompaktus. Nusprendžiau juos padovanoti jums – kas mėnesį po vieną kas antrą savaitę po vieną!

IMG_0088

Taisyklės:

Šio straipsnio komentaruose parašykite savo vardą ir pavardę arba slapyvardį. Kiekvieno mėnesio 15-ą bei paskutinę dieną atsitiktine tvarka išrinksiu vieną nugalėtoją, kuriam ir atiteks dovana. Kompaktą galėsiu perduoti tik VILNIUJE ir KAUNE. Jeigu esate iš kito miesto – teks patiems atvažiuoti į Vilnių.

Rodyk draugams