» »

[C#] Entity Framework

[C#] Entity Framework

snooze77 ::

Pozdravljeni, zanima me če je že kdo delal z Entity Framework in MySQL. Naredil sem enostaven primer Code-First načina vendar mi enostavno ne uspe usposobiti.
Imam razred Osebo, ki jo hočem vstaviti v bazo
 public class Oseba
    {
        int id;
        String ime;     
        [Key]        
        public int Id
        {
            get { return id; }
            set { id = value; }
        }
         public String Ime
        {
            get { return ime; }
            set { ime = value; }
        }
    }


Razred, kjer hočem vstavit osebo
class Metode 
    {
        MySqlContext con;
        public void Ustvari()
        {           
            con = new MySqlContext();
            Oseba o = new Oseba();
            o.Ime = "Test";
            con.Osebe.Add(o);
            con.SaveChanges();
        }
    }


Potem imam še razred Context v katerem določim custom Connection string in DBset za osebe. V app configu sem spremenil default podatke od EntityFrameworka na Mysql-ove.
Problem, ki mi ga skos meče je v vrstici con.SaveChanges();
Po pregledu inner Exception-a sem našel tole "Table 'test.osebas' doesn't exist" in nimam pojma kako to popravit.

darkolord ::

Povedati mu moraš, kaj naj naredi z bazo, če še ne obstaja, npr.:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MySqlContext>());


Initializerjev imaš več (Google ti bo pomagal), lahko tudi svojega narediš.

Qushaak ::

Glede sodobnih verzij EF imam vprašanje, ki ga bom kar opisal s primerom.
Recimo, da poizvedujemo za podatki, ki jih potem kažemo v tabeli. Ponavadi se potem pošlje samo toliko zadetkov na client-a (web), kolikor jih je na strani (recimo 10, 20, 50,...), pošlje pa se še podatek koliko je vseh zadetkov, ki ustrezajo filtru (ki je običajno skupaj s tabelo).

var query = [ef_linq_query_glede_na_nastavljene_filtre_za_tabelo]
var count = query.CountAsync();
[Lahko_še_kaka_programska_koda]
var result = query.Skip(x).Take(y).ToListAsync();

Jasno je, da se lahko poizvedbi izvajata vzporedno ter se s tem prišpara nekaj časa oz pohitri metodo, ki vrača rezultat (recimo da se count spremenljivko vrne z "out" poleg rezultata - načeloma pač ni pomembno, rabi pa se ta podatek).
Prihaja potem do takih težav:
http://stackoverflow.com/questions/2094...
http://stackoverflow.com/questions/2470...
http://stackoverflow.com/questions/2470...

Če se osredotoči samo ne sodobne verzije EF-ja (6.1.3+ in EF Core 1.0+), kako bi se dalo zaobiti tak problem, ker dbContext ne omogoča sočasnega operiranja?
Zdi se mi neumno, da bi tako lahko "paraleliziranje" problema (čeprav morda včasih pospeški niso ravno tako dramatični) zavrgel zaradi tehničnih omejitev.
Je sploh realno v prihodnosti od EF-ja pričakovati, da bi se dalo tako izvajati asinhrone ali celo paralelne klice (PLINQ)?
Navedel sem le en primer, ki je recimo precej običajen, podobnih pa je še ogromno.
Glede na to, da je EF mišljen kot zamenjava za ADO.NET bi enkrat v dokaj bližnji prihodnosti to morali pošlihtati oz. vsaj omiliti.
Hvala za nasvete.

nightrage ::

Če si diagram naredil iz baze potem ti ni potrebno narediti class Oseba, saj ti entity zgenerira class Oseba, drugač pa napaka pravi da tabela Oseba ne obstaja v podatkovni bazi, tako da preveri če ti je entity sploh ustvaril podatkovno bazo.

Zgodovina sprememb…

frudi ::

Qushaak, kaj pa imaš to za query, da zajema toliko tabel? Sklepam, da imaš nek kompleksen objektni graf, ki ga želiš filtrirati po nekih vgnezdenih objektih in lastnostih? Mogoče se še bere iz precej kompliciranih view-ev na bazi?

Po mojih izkušnjah EF hitro pogrne pri takšnih problemih, enostavno je zgeneriran SQL query preveč kompliciran, z ogromno vgnezdenimi pod-selecti in podobno navlako. To v najboljšem primeru prinese probleme s hitrostjo, v najslabšem pa nedelujoče poizvedbe, zaradi preveč zajetih tabel (kot v tvojem primeru) ali preveč vgnezdenih pod-selectov.

Moja rešitev je v takih primerih bila vedno staromodna, ampak imho vredna truda - spiši stored proceduro za takšne, posebej zahtevne poizvedbe. Tam lahko query komot razbiješ na manjše probleme, uporabiš začasne tabele, ročno optimiziraš joine in filtrirne kriterije ter uporabiš še ostale trike, ki ti padejo na pamet. In pa execution plani ti pri taki uporabi precej bolj pomagajo najti in odpraviti ozka grla.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

Qushaak ::

Hm, očitno nisem dovolj razumljivo napisal kaj hočem.
Ne gre za performančne probleme, ampak, da se lahko del časa izvaja več poizvedb nad bazo (kar je pri web aplikacijah ponavadi znotraj istega ef context-a, ki pa ne dopušča takega "pristopa").
poizvedbe so mišljene tu precej bazične, samo želel bi, da se izvajajo vzporedno, ker pač ni nobenega "preseka" med njimi ter tako najlažje pridobim nekaj na "hitrosti".

frudi ::

Ta del sem nekako razumel, ampak ne vem, zakaj bi vzporedne poizvedbe pripeljale do linkanih napak, češ da poizvedba ni možna, ker referencira več kot 256 tabel. Meni tole zveni bolj, kot preveč kompleksna individualna poizvedba. Je pa res, da se s tem problemom še nisem srečal, tako da komot, da se lahko zgodi tudi to, le čudno se mi zdi.

Kot si ugotovil, posamezen DbContext ni thread-safe, tako da kolikor vem, lahko pozabiš na sočasno izvajanje večih poizvedb.

Pristop s stored procedurami bi ti potencialno še vedno lahko pomagal, ker znotraj procedure, če uporabljaš kakšne začasne tabele, izvajaš sortiranje, paging in podobno, dostikrat lahko precej "poceni" dobiš še število vseh zadetkov (v primerjavi z dodatnim klicem na bazo samo za count operacijo). Je pa res, da samo za to ni vredno pisati procedur.

Drugače lahko ustvariš še en DbContext (ali več njih) in zaženeš naslednjo poizvedbo sočasno na njem. Odvisno od primera do primera, ali se splača, najbolje, da stestiraš.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[UWP] [C#]

Oddelek: Programiranje
424065 (2095) BivšiUser2
»

C# visual studio SQL problem

Oddelek: Programiranje
72006 (1584) Apple
»

C# težava

Oddelek: Programiranje
233554 (2400) mladec
»

SQL poizvedba

Oddelek: Programiranje
163146 (2491) awy
»

ASP, MySQL, UTF8, GoDaddy, šumniki

Oddelek: Programiranje
51124 (993) techfreak :)

Več podobnih tem