[ alfa-pro @ 03.08.2016. 21:13 ] @
Drustvo primoren sam da radim app bez koriscenja Entity Frameworka u asp.net mvc-u.
Sto se mene tice ja se nebi odvajao od EF, pokusavao sam da ubedim ali neide.

Na koju foru mogu da zadrzim modele ali bez EF?

Neka moja zamisao je da koristim klasicnu System.Data.SqlClient assembly
Napravim npr u model diru klasu Blog koja bi mi bila model sa aksesorima nrp Title, Text, Created, Modifed da kazemo simple.
Da napravim BlogRepository sto bi bilo kao u EF Context klasa gde bi vracao upite (FintAll, Find, Insert, Update).

Sve u svemu ovaj moj primer koliko sam ja predpostavio ne pije vodu i da je ovo za kantu ako ovako uradim.

Mislim totalno mi sada ovo novo nikada nisam radio bez EF sem u web page projektima tu sam koristion WebMatrix.Data assemply i to sljaka super, ali de WebMatrix.Data da koristim u MVC malo bzv a?

Moze neki primer ili da me neko usmeri kako ovo najbolje uraditi a i da moze da se radi unit testing.

Hvala unapred
[ Shadowed @ 03.08.2016. 22:01 ] @
Da ne zalazimo u to zasto ne mozes koristiti EF, mozes bez problema koristiti SqlConnection/Command/Reader.
Svodi ti se na to da napravis instancu konekcije, komande, povezes ih, dodas string sa query-em u komandu i dodas parametre (uvek koristi parametre, nemoj sastavljati query nadovezivanjem stringova), otvoris konekciju, izvrsis komandu i iscitas vrednost (ako je select query), zatvoris konekciju.
Mozes naci primer na netu.

E sad, imaces, neke modele koji ti preslikavaju tabele ili tacnije, koje preslikavaju rezultate upita. Ako ti je neki mikro projekat, mozes sve da radis pesaka kao sto sam naveo u drugoj recenici. Ako je projekat malko veci, zavisno koliko imas vremena da odvojis za to, mozes sebi olaksati stvari tako sto uradis neke od sledecih stvari:
Napravis pomocnu fukciju za izvrsavanje query-a kojoj prosledjujes samo query i parametre. Tacnije, trebace ti tri takve uz neki zajednicki deo: za Execute (vraca reader), ExecuteScalar i ExecuteNonQuery. Obrati paznju na zatvaranje konekcije kod prve.
Ako imas malo modela, mozes svakom dodati funkciju koja iz reader-a ucitava vrednosti iz kolona u njegove property-e.
Ako imas mnogo modela, mozes napraviti pomocnu klasu/metodu koja refleksijom ucitava iz kolona reader-a u property-e. Ovo ti je lakse ako se imena property-a poklapaju sa imenima kolona. Ako se ne poklapaju, mozes dodavati atribute koji definisu imena kolona sa kojima se property sinhronizuje.
Ako imas gomilu standardnih GetByID, Update, Insert, DeleteByID, opet mozes pomocu refleksije, slicno prethodnom generisati query-e.

I tako, ako imas dovoljno potrebe i vremena, napravis sebi mini EF :) (veci deo navedenog i on radi)
S tim da ti sebi mozes napraviti da radi u heppy flow-u i po potrebi sporedne slucajeve, ne moras pokrivati razne granicne slucajeve i mogucnosti da neko koristi to kako ne treba (pravis za sebe).

P.S. Ako nisi vec radio na ovaj nacin (direktno sa konekcijama i komandama), mozda ce ti neke od stvari koje sam navodio biti nejasne, ali kako se budes udubljivao, mozes se vratiti na ovaj post pa ce biti jasnije :)
[ djordjeno @ 04.08.2016. 10:38 ] @
Citat:
alfa-pro: Drustvo primoren sam da radim app bez koriscenja Entity Frameworka u asp.net mvc-u.
Sto se mene tice ja se nebi odvajao od EF, pokusavao sam da ubedim ali neide.

Na koju foru mogu da zadrzim modele ali bez EF?

Neka moja zamisao je da koristim klasicnu System.Data.SqlClient assembly
Napravim npr u model diru klasu Blog koja bi mi bila model sa aksesorima nrp Title, Text, Created, Modifed da kazemo simple.
Da napravim BlogRepository sto bi bilo kao u EF Context klasa gde bi vracao upite (FintAll, Find, Insert, Update).

Sve u svemu ovaj moj primer koliko sam ja predpostavio ne pije vodu i da je ovo za kantu ako ovako uradim.

Mislim totalno mi sada ovo novo nikada nisam radio bez EF sem u web page projektima tu sam koristion WebMatrix.Data assemply i to sljaka super, ali de WebMatrix.Data da koristim u MVC malo bzv a?

Moze neki primer ili da me neko usmeri kako ovo najbolje uraditi a i da moze da se radi unit testing.

Hvala unapred



Pre bih rekao da ti je neko ucinio uslugu:) EF nije jedini ORM tako da imas druge koji mogu da ga zamene.

Poenta je da model, koji je u kontrolerima/view-ima, nema jaku vezu (tight/strongly coupled) sa bazom koja je pozadi.
Tako da eventualne promene RDBS (baze) ne bi smele da ti sruse logiku u web delu.

Pojednostavljeno arhitektura bi bila nesto u stilu model => koji koristi layer/repository => koji koristi neki ORM.
[ alfa-pro @ 04.08.2016. 11:13 ] @
Aj probacu nesto od ovoga navedeno pa cu da vidim na sta ce to da ispadne. Pa ovaj sada projekat koji ce se raditi je omanji nista specijalno ali imam prikolicu projekata. Cela prica firme je da batali EF za stalno u svim projektima
[ dejanet @ 04.08.2016. 11:32 ] @
Pogledaj Dapper:
https://github.com/StackExchange/dapper-dot-net

[ Shadowed @ 04.08.2016. 12:02 ] @
Citat:
alfa-pro: Cela prica firme je da batali EF za stalno u svim projektima

Cisto iz radoznalosti.. Zasto? :)
[ mmix @ 04.08.2016. 15:14 ] @
Da, i mene to interesuje. Mogu da razumem EF4, to je stvarno bilo umobolno, ali sta fali EF6.1.3? I jos bolje, sta fali EF Core 1.0 (EF7)?

[ alfa-pro @ 05.08.2016. 11:04 ] @
Pa politika firme, izgleda da se to nesvidja tom senioru koji je nama sef a on je tako kao neki.... Mislim da LINQ upite ne moze vise nista da mi zameni ali ajde ko sam ja tu da se pitam nesto
[ mmix @ 05.08.2016. 22:35 ] @
LINQ kao LINQ nije nikakva misterija, to je samo laksi nacin da se izgradi tzv "expression tree", na provajderu je da implementira IQueryable i pretoci to drvce u konkretan upit. Samim tim, ne postoji ogranicenje na sta se LINQ moze primeniti (npr NHibernate ima odlicnu implementaciju).

Iako je upotreba SqlCommand paterna ogranicavajuca u tom smislu da ne mozes da definises upite, uvek mozes rezultat da pretabas u objektni model i da onda koristis LINQ to objects i da te objekte koristis u MVCu. To mozes da uradis bilo preko recimo Dapper-a ili sam, kroz nad=upit ili kroz konverziju reader-a u iterator metod

query:
Code (csharp):

var list = reader.Cast<IDataRecord>()
                 .Select(dr => new MyType { Ime = dr.GetString(0), ... })
                 .ToList();
 


iterator
Code (csharp):

        private static IEnumerable<CustomerDefinition> ProcessCustomerDataReader(DbDataReader dr, CancellationToken token)
        {
            if (dr.HasRows)
            {
                while (dr.Read() && !token.IsCancellationRequested)
                    yield return new CustomerDefinition()
                    {
                        CustomerNo = (int)dr.GetDecimal(0),
                        Title = dr.IsDBNull(1) ? null : dr.GetString(1),
                        FirstName = dr.IsDBNull(2) ? null : dr.GetString(2)                    };
            }
        }

    from c in ProcessCustomerDataReader(dr, token)
    ....

 
[ alfa-pro @ 06.08.2016. 10:40 ] @
Ma nemam ja problem sa LINQ upitima kao sto sam gore vec napomenuo. Da se ja pitam nikada ne bi menjao EF a ni koriscenje LINQ upita!
[ ik0 @ 05.12.2016. 21:24 ] @
Probaj ovo na posao mi je novija verzija, ovo smo na posla sami uradili da bi mogli bolje da radimo sa stored procedure.

evo ti i neki primer, pogledaj fajlove

*ExtensionMethods
*Extensions
i resto :D nismo pisali dokumetaciju tako da trebas sam da razumes kako radi :D a inace pola government institution u Maltu rade sa ovim (posto mi uglavno radimo te vladine zaebacije) i mnogo je dobro :D

Code:

public class User
{
    [ProcedureParameter("@name")] //primer namesto onaj dole linq da se ubijes od pisanja 
    [ResultParameter("Name")]  //ExecuteProcedureWithResult sama upise sve rezultate u odgvarajuca polja
    public string Name { get; set; }
 
    [ProcedureParameter("@surname")]
    [ResultParameter("Surname")]
    public string Surname { get; set; }
 
    [ProcedureParameter("@id", true)]
    [ResultParameter("Id")]
    public int ID { get; set; }
}
 
Executing on the Database
 
User[] users = db.ExecuteProcedureWithResult<User>("[Users].[usp_GetAllUsers]");
 
Sample
 
db.OpenConnection();
User[] users = db.ExecuteProcedureWithResult<User>("[Users].[usp_GetAllUsers]");
db.CloseConnection();
MessageBox.Show(users.Select(x => String.Format("{0} {1}", x.Name, x.Surname)).Aggregate((x, y) => String.Format("{0}\n{1}", x, y)));

        IDataBaseProvider datah =
            SqlAccessLayer.CreateDatabaseProvider(
                ConfigurationManager.ConnectionStrings["ArtemisconnString"].ToString().Trim());

        List<ApplicationList> agendas = new List<ApplicationList>();

        var param = datah.GetParameter("@date", DbType.Date, date);

        datah.OpenConnection();

        agendas =
            datah.ExecuteProcedureWithResult("usp_GetAgendasDetailsByDate", param)
                .Select(
                    x =>
                        new ApplicationList
                            {
                                SystemKey = x.Read<int>("SystemKey"),
                                Architect = x.Read<string>("Architect"),
                                CaseNumber = x.Read<string>("Case Number"),
                                ItemNumber = x.Read<string>("ItemNumber"),
                                Location = x.Read<string>("Location"),
                                Proposal = x.Read<string>("Proposal"),
                                Recommendation = x.Read<string>("Recommendation")
                            })
                .ToList();

        datah.CloseConnection();