Entity Framework og Stored Procedures.

Jeg har lige opdateret min visual studio 2008 med service pack 1, og afinstalleret 3.5 extensions pakken som tidligere var der alle godterne lå. Bla. lå Entity Frameworket og Data Services i den extensions pakke. De er nu udkommet med SP1 og har du ikke opdateret din VS.NET endnu synes jeg du skal gøre det, for der ligger mange fede ting i den service pack.

Jeg har siddet og arbejdet lidt med ADO.NET Data Services, og hold da op hvor jeg synes det er fedt. Det er nemt at konfigurere og lækkert at man ikke skal skrive én eneste linie kode for at få adgang til sine data igennem f.eks REST.

Jeg har også kigget lidt på Entity Frameworket, men det forvirre mig mere end det gavner. Jeg synes bla. designeren er mega ringe - hvorfor kan jeg f.eks ikke se alt med mapping kode til mine containers og hvorfor kan jeg ikke mappe en Stored Procedure til en primitiv type ? Hvis du har en Stored Procedure som returnere en liste af tal, så kan du ikke længere bruge designeren i VS.NET til at lave en Function Import, det er kun hvis din Stored Procedure returnere en entitet (tabel). Godt nok har du mulighed for at vælge en primitiv type når du laver en Function Import i VS.NET, men den generere ikke noget kode for dig som den ellers ville gøre hvis du valgte en entitet som retur værdi.

functionimport 
(2 entiteter i bunden af listen)

Designeren generere en masse kode for en når man hiver entiteter ind i sin model/container, efterfølgende kan du så mappe Stored Procedures som funktioner, VS.NET generere også kode for disse hvis ellers de returnere en entitet. Når der genereret kode til dine entiteter og funktioner kan du kalde disse fra resten af din applikation. Hvor ofte har du en Stored Procedure der returnere andet end en tabel fra din database ? Jeg gør det tit!

Heldigvis er den model klasse der bliver genereret markeret med partial, så kan vi bygge videre på den.

Jeg har en Stored Procedure i min model/database som jeg har mappet til en int, men koden er ikke blevet genereret fordi det er en primitiv type. Jeg skal altså selv skrive koden til dette.

[assembly: global::System.Data.Objects.DataClasses.EdmSchemaAttribute()]

namespace DanielAnalyticsModel
{
    public partial class DanielAnalyticsEntities : global::System.Data.Objects.ObjectContext
    {
        public int GetMonthlyVisits( int year )
        {
            using( System.Data.EntityClient.EntityConnection conn =
                new System.Data.EntityClient.EntityConnection( "Name=DanielAnalyticsEntities" ) ) {
                conn.Open();
                System.Data.EntityClient.EntityCommand cmd = new System.Data.EntityClient.EntityCommand();
                cmd.CommandText = "DanielAnalyticsEntities.DanielAnalytics_MonthlyVisits";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Connection = conn;
                cmd.Parameters.AddWithValue("year", year);

                return (int)cmd.ExecuteScalar();
            }
        }
    }
}

Jeg ved ikke rigtig hvad jeg synes om det her kode, for det netop det Entity Frameworket skulle lave for mig. Hvad synes du ?