Intilnire RONUA Bucuresti, 24 ianuarie 2012 , ora 18:30

Pentru ca a inceput un nou an si pentru ca multi recomanda sa invatam un nou limbaj in fiecare an , la aceasta intilnire RONUA ne vom juca cu un nou IDE:  LightSwitch.

Alexandru Badita va prezenta :

LightSwitch Out of the box
A. Environment – Explicatii, Logical View/File View
B. DAL – Data access – conectarea la diferite tipuri de date si strategii aici / DB – Triggers / internal programming best practices.
C. BL – business layer – discutie despre filtrare/sortare hardcodata/ din interfata (Ce e aia ?)
D. UI – client user interface – Silverlight integration with/without data access (Ce e asta?)
E. Deploy app – tipuri de deployment Desktop/IIS/Cloud

E1. Exemplu practic (crearea unei aplicatii complete + pachet distribuire desktop/IIS suport pentru prezentarea de mai sus)

Data: 24.01.2012, ora 18:30

Locatie: Sediul TeamNet , sala Training Multifunctionala.
Str. Splaiul Independentei, No. 319,  RIVER Place, RIVERVIEW House, etaj 8,Sector 6,
(la parter este o clinica CMU)

Va rog sa va aduceti BI / CI  pentru a intra.

Harta: click aici : http://www.teamnet.ro/stiri/harta01.html

Detalii acces:
Poți ajunge aici cu urmatoarele mijloace de transport in comun: metrou , statia Petrache Poenaru , fosta Semanatoarea.

Multumesc si te astept!
Andrei Ignat

Posted in ronua | Leave a comment

Lauda de sine cu Asp.NET

Daca va uitati repede la http://www.asp.net/ ,  Daily Community Spotlight , sunt si eu pe acolo cu  Usual Methods to transfer data from Page To Page in ASP.NET MVC .

 

Da , ma laud singur … dar poate, daca va place MVC, va place si acest post Winking smile

Posted in ASP.NET, Asp.NET MVC, lauda | 6 Comments

PMKB 1- importanta generarii automate a codului

Pentru PMKB, http://pmkb.codeplex.com/ am dorit sa muncesc cit mai usor. Si, pentru ca adopt o strategie gen Table per Type am considerat ca designul bazei de date este cel al claselor.

Daca va uitati la proiectul PMKB_DAL o sa vedeti urmatoarele fisiere .tt

  1. Model1.Context.tt – genereaza EFContext si genereaza codul pentru Fluent API, ca de exemplu:
    modelBuilder.Entity<Link_Tag>().ToTable(HelperTables.NameTable(Tables_PMKBEntities.Link_Tag));
        		modelBuilder.Entity<Link_Tag>().HasKey(item => item.LinkTagID);
    
        		modelBuilder.Entity<Link_Tag>()
        				.HasRequired(item => item.Link_LinkID_Link_Tag_LinkID)
        				.WithMany(u => u.Link_LinkID_Link_Tag_LinkID)
        				.HasForeignKey(x => x.LinkID)
        				.WillCascadeOnDelete(false);
    
  2. Model1.tt – genereaza codul pentru fiecare clasa + o interfata pentru ea:
     public interface I_Link
        {
        long LinkID{get;set;}
        string LinkName{get;set;}
        string LinkDescription{get;set;}
        string LinkUrl{get;set;}
        Nullable<long> CreationUserID{get;set;}
        Nullable<System.DateTime> LinkCreationDate{get;set;}
        string LinkShortURL{get;set;}
        }
    
        public partial class Link: FastDatabaseQuery.IReceiveVisitor, I_Link
        {
    
  3. ITList.tt – genereaza codul pentru clasa Lista – pentru fiecare tabela pot sa vreau sa incarc mai multe rinduri sau sa sterg ceva rapid:
    
     [System.Diagnostics.DebuggerDisplayAttribute("Link_List Count={Count}")]
        public partial class Link_List : ColList<Link>
        {
    //code
     public void Delete_LinkID(long value)
            {
                    base.Conection.Database.ExecuteSqlCommand("delete from " + HelperTables.NameTable(Tables_PMKBEntities.Link) + " where LinkID = {0}",value);
            }
    

    Astfel incit codul devine:

    using (Link_List ll = new Link_List(ConnectionName))
                {
    
                    if (string.IsNullOrEmpty(OrderBy))
                        OrderBy = Link_List.FieldNames.LinkID;
    
                    var iq = ll.LoadFromDB.LoadAllQ();
                    var ordered = Link_FindDB.OrderByField(iq, OrderBy);
                    if (!string.IsNullOrEmpty(Search))
                    {
                        ll.LoadFromDB.AddToCustomPredicate(Link_FindDB.fexp_LinkUrlContainsMultipleDef(Search), false);
                        ll.LoadFromDB.AddToCustomPredicate(Link_FindDB.fexp_LinkDescriptionContainsMultipleDef(Search), false);
                        ll.LoadFromDB.AddToCustomPredicate(Link_FindDB.fexp_LinkNameContainsMultipleDef(Search), false);
                        ordered = ll.LoadFromDB.LoadFindCustomPredicateOrderedQ(OrderBy);
                    }
    
                    return ordered.ToPagedList(pageNumber, PageSize);
    
                }
    
  4. Find.tt – genereaza codul pentru cautare in BD ( de exemplu, pentru date pot sa am between) . IN acest exemplu arat fexp_LinkUrlContainsMultipleDef care face Like din Sql :
      public static Func<string, Expression<Func<Link, bool>>> fexp_LinkUrlContainsMultipleDef = value => fexp_LinkUrlContainsMultiple(value, "%");
    
             public static Func<string,string, Expression<Func<Link, bool>>> fexp_LinkUrlContainsMultiple = (value,separator) =>
            	{
            		value=value.ToLower();
            		var arr=value.Split(new string[1]{separator}, StringSplitOptions.RemoveEmptyEntries);
            		switch(arr.Length)//TODO: use a better expression here rahter than based on length
            		{
            			case 1:
            				return (item =>  item.LinkUrl != null  &&  item.LinkUrl.ToLower().Contains(value));
            			case 2:
            				 {
            				  string v1=arr[0].Replace(separator,"");
            				  string v2=arr[1].Replace(separator,"");
            				 return (item =>  item.LinkUrl != null  &&  item.LinkUrl.ToLower().Contains(v1)  &&  item.LinkUrl.ToLower().Contains(v2) );
            				}
            			default:
            				 {
            				   string v1=arr[0].Replace(separator,"");
            				  string v2=arr[1].Replace(separator,"");
            				  string v3=arr[2].Replace(separator,"");
            				return (item =>  item.LinkUrl != null  &&  item.LinkUrl.ToLower().Contains(v1) &&  item.LinkUrl.ToLower().Contains(v2) &&  item.LinkUrl.ToLower().Contains(v3) );
            				}
    
            		}
    
            	};	 
    
  5. Resource.tt – genereaza codul pentru fisiere resx – de exemplu , pentru fiecare clasa am nevoie de “edit”, “delete”, “new” , nume de label pentru (aproape) fiecare proprietate
     <data name="Accessed_AddNew" xml:space="preserve"><value>Add new Accessed</value></data>
    <data name="Accessed_List" xml:space="preserve"><value>List of Accessed</value></data>
    <data name="Accessed_Found_Multi" xml:space="preserve"><value>found {0} Accesseds</value></data>
    <data name="Accessed_Found_One" xml:space="preserve"><value>One Accessed found</value></data>
    <data name="Accessed_Found_Zero" xml:space="preserve"><value>No Accessed found</value></data>
    <data name="Accessed_Save" xml:space="preserve"><value>Save Accessed</value></data>
    <data name="Accessed_Save_Error" xml:space="preserve"><value>Error saving Accessed</value></data>
    <data name="Accessed_Delete_Error" xml:space="preserve"><value>Error deleting Accessed</value></data>
    
  6. Visitor.tt – daca am nevoie sa generez ceva date despre fisiere. Implementeaza Visitor pattern din Design Patterns.
     public partial class Link: FastDatabaseQuery.IReceiveVisitor, I_Link
    
    public partial class Link_Visitor: FastDatabaseQuery.IPropertiesVisitor
        {
    
             public string Visited(FastDatabaseQuery.IReceiveVisitor i)
             {
    

Bineinteles ca fiecare cod are nevoie de imbunatatiri. De aceea imi trebuie cod intercalat – si, de obicei, profit de partial in (aproape ) toate formele sale:

1. la definitia clasei
De exemplu,clasa Link_OLAP trebuia sa implementeze si interfata I_Link . Asa incit am adaugat un fisier .cs in care am scris

partial class Link_OLAP:I_Link
    {
    }

2. la introducerea unor metode pe care pot sau nu sa le definesc in corpul clasei asociate.
De exemplu, pentru definirea Modelului trebuia sa spun ca LinkID nu este autogenerat( o problema stupida a EF, care incearca sa fie destept)
Cind am facut override la OnModelCreating am definit si urmatoarele:

partial void OnBeginModelCreating(DbModelBuilder modelBuilder,ref bool Continue);
    	partial void OnFinishModelCreating (DbModelBuilder modelBuilder);
    	protected override void OnModelCreating(DbModelBuilder modelBuilder)
    	{
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
    		bool Continue=true;
    		OnBeginModelCreating(modelBuilder, ref Continue);
    		if(!Continue)
    			return;
//construct default
modelBuilder.Entity<Accessed>().ToTable(HelperTables.NameTable(Tables_PMKBEntities.Accessed));
    		modelBuilder.Entity<Accessed>().HasKey(item => item.AccessedID);
//other code
OnFinishModelCreating(modelBuilder);

    	}

Asa ca am adaugat un nou fisier, am pus partial class si am definit OnFinishModelCreating ( Nu era obligatoriu – de ex., nu am definit OnBeginModelCreating)

public partial class PMKBEntities
    {
        partial void OnFinishModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Link_OLAP>().Property(item => item.LinkID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        }
    }

Deci, daca nu stiti ce sunt fisierele .tt, atunci cititi de la Hanselmann

http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx

si mergeti mai departe.

Puteti downloada solutia de la http://pmkb.codeplex.com/

Rezumat

Fisierele .tt va fac viata mai usoara, daca aveti definita o structura de baza. Folositi-le!

Posted in .NET, PMKB, tt | Tagged | 3 Comments

PMKB–un an

Anul acesta o sa fie diferit. Am hotarit sa ma apuc de o singura aplicatie pe care sa o imbunatatesc cel putin 1 ora pe zi.

Ea se numeste PMKB – de la PoorMan Knowledge Base. Poate fi downloadata de la adresa

http://pmkb.codeplex.com/

Ea consta in ordonarea unei colectii de linkuri in tag-uri. Ginditi-va cind ajungeti la un nou serviciu – si toate informatiile sunt diseminate de colo-colo. Ea va ajuta sa adaugati rapid un link cu un tag si sa le regasiti pe urma.

As vrea sa o fac cu tot ce trebuie – de la unit testing la WPF, trecind prin IE Pinned sites si altele.

E facuta in MVC3 . Ce am reusit sa fac este sa o fac functionala si sa ii adaug posibilitatea de plugin-uri. 

O gasiti la adresa http://pmkb.codeplex.com/ – o puteti downloada rapid si instala la fel( e bazata pe EF Code first –derivat din edmx, ma rog – dar CodeFirst si are ca baza de date  SqlServer Compact )

Data viitoare scriu ce am invatat facind-o – si asa o sa continue intregul an.

Posted in Asp.NET MVC, proiecte, proprii | 4 Comments

La multi ani!

La multi ani si sarbatori fericite!

Si, daca ati intilnit un site / cineva / ceva care v-a facut fericiti, donati ceva.

Pentru mine, a fost Wikipedia

wiki3

Daca aveti posibilitatea , faceti un gest acum.

La multi ani!

Posted in an nou | Leave a comment

inside windows communication foundation

image

O carte buna. Te trece prin toate definitiile de SOAP . Din pacate, la ABC ( address – binding – contract) insista mai putin  -dar tot e buna.

De citit neaparat.

Posted in carti | Leave a comment

ORM sau ADO.NET direct

O intrebare care revine deseori este ce folosim :Un ORM ( L2S, EF, NHibernate, custom code) sau ADO.NET direct( procedura stocata, trimitere de query la BD ) ?

Criteriile pe care le folosesc sunt :

  • timpul de dezvoltare  – timpul pe care il aloc eu, ca dezvoltator, ca sa scriu codul
  • performanta – timpul in care codul meu se executa ca sa faca obtina rezultatul dorit. Inclusiv cit imi ia timpul de incarcare al datelor din BD.

Tinind seama de aceste criterii, pentru mine  exista un raspuns clar : depinde.

Enumar cazurile mele principale :

  1. Utilizez un ORM ca sa ma scape de bataia de cap cu filtering/paging/sorting. Daca ati scrie un query de mina cu asta sau o PS – ar fi destul de greu ( oribil ca timp de dezvoltare)
  2. Sa zicem ca vrem sa modificam toate contractele pentru clientii care au > 4 ani si le dam inca o luna gratis. Daca am face asta cu un ORM ar insemna un cursor( oribil ca performanta) – asa ca mai bine facem un  ADO.NET direct “ update  table …” – cu procedura stocata sau direct ca text
  3. Daca vreau sa fac update la o un singur cimp ( de exemplu, daca vreau in incrementez numarul de download pentru un fisier) este absurd(oribil ca performanta: timp de incarcare) sa incarc row-ul de fisier cu ( id, , nume, cale, numarul de download si alte date) ca sa obtin incrementez doar numarul de download si sa salvez inapoi in BD. Mai bine fac un update rapid cu ADO.NET direct . ( Oh, daca sunt puturos , chiar folosesc ORM)
  4. Daca fac update pe mai multe cimpuri, e absurd ( oribil ca timp de dezvoltare) sa scriu un update pentru toate cimpurile. Mai bine folosesc ORM-ul.

Concluzia: folositi right tool for the right job.

Adaugare: Tudor Turcu , http://tudorturcu.wordpress.com/ adauga ca ADO.NET se mai foloseste la reporting si la optimizari de SP. -vezi comentariu.

PS :Mai stiti si alte cazuri ?

Posted in .NET, ado.net, discutii, ORM, programare | 4 Comments

Jquery ajax si MVC

Am reusit sa fac un post mai detaliat despre Jquery ajax si MVC. Este cu Razor – dar se poate folosi si cu aspx.

Il gasiti aici

http://msprogrammer.serviciipeweb.ro/2011/12/05/jquery-ajax-request-and-mvcdetailed/

Feedback acolo, please Winking smile

Sper sa va placa.

Posted in ASP.NET, Asp.NET MVC | Leave a comment

Prezentare RONUA / ITCamp

Prezentarea a fost urmatoarea:

EF41 cu tt

- Vine cu VS2010 SP1 . Mai e bine sa va instalati SqlServerCompact 4.0
- Demo 1 : generare bd (Express / Sql Server Compact), required attribute versus fluent api

Fisiere .tt

- CodeSmith
- Genereaza orice – cu conditia sa ai rabdare
- Demo2: generare a 20 de clase

EF41 cu fisiere tt

- De ce DAL/ORM trebuie sa inceapa de la BD si nu invers.
- Istoric : L2S, EDMX, POCO
- Template-ul de ef4.1 este super simplist
- Modificare template-ului de ef4.1

Resurse fisiere .tt :

Oleg Sych – » T4: Text Template Transformation Toolkit
.Net Head » Replacing ResXFileCodeGenerator with a T4 Template: Customize your resource access code.
T4 Templates: A Quick-Start Guide for ASP.NET MVC Developers – Visual Web Developer Team Blog – Site Home – MSDN Blogs
Oleg Sych – » T4 template for generating SQL view from C# enumeration
Get Visual Studio to run a T4 Template on every build – Stack Overflow
( le gasiti in atasamentul zip)ronua

Rezumat

EF4.1 in sfirsit este xcopy deployment ( .NET 4.0). S-ar putea ca EF4.2 sau 5.0 sa fie ok.

Intrebari

Download fisiere
http://serviciipeweb.ro/iafblog/wp-content/uploads/2011/11/ronua.zip

Update:
Prezentarea lui Andrei Rinea despre WCF Streaming o gasiti aici
http://blog.andrei.rinea.ro/2011/11/26/wcf-streaming-slides-and-code/

Posted in Uncategorized | 1 Comment

Eveniment tehnic sambata, 26 noiembrie 2011

Simbata asta , de la ora 10 , la sediul Microsoft România din Piaţa Presei Libere nr. 3-5, Clădirea City Gate Sud, etaj 2, sala Remus prezint MVC / EF si pasiunea mea ultima, template-urile .tt

O sa ramin sigur si la WCF Streaming a lui Andrei Rinea.

Vedeti aici

http://itcamp-bucuresti.eventbrite.com/

Posted in prezentare | Leave a comment