Învățând engleza cu Entity Framework

Tocmai mă jucam azi cu nou-apărutul Entity Framework 5 beta – creez o clasa Person, merg in DB și creez o tabela Persons, un DbContext și mă aștept ca EF code-first să deducă maparile pentru mine (convention over configuration), cum a făcut-o și până acuma.
Mă asigur ca EF mă lasă să-mi creez singur baza de date:
Database.SetInitializer(null);
La execuția primului query însă, o excepție:

...
InnerException: System.Data.SqlClient.SqlException
Message=Invalid object name 'dbo.People'.
Source=.Net SqlClient Data Provider

wtf? Se pare că EF știe engleză mai bine decât credeam, și știe că forma uzuală a pluralului la ‘person’ e ‘people’, nu ‘persons’. 🙂

“Vinovatul”? PluralizingTableNameConvention – convenția implicită folosită de EF code-first când încearcă să deducă numele tabelei plecând de la numele clasei.

În altă ordine de idei, customizable conventions e o chestie foarte utilă când cineva are de-a face cu zeci de tabele și sute de field-uri, iar naming convention-urile sunt impuse din exterior de vreun DB admin. EF customizable/pluggable conventions nu au intrat in versiunea finala a EF 4.1 (erau prin EF Feature CTP5) – nu am verificat încă dacă in versiunile mai recente (4.3) au reușit să le reintroducă.

Advertisements
This entry was posted in .NET, Entity Framework and tagged , . Bookmark the permalink.

4 Responses to Învățând engleza cu Entity Framework

  1. Andrei Ignat says:

    Urasc naming conventions. Si imi place sa fac conventiile de mina – nu sa creada el ca isi poate alege PK/FK. Si mie imi ajunge EF Fluent API + database migrations . Tie la ce iti trebuie pluggable conventions?

    • Tudor Turcu says:

      Cand e vorba de un proiect nou, code-first, in care echipa creaza si baza de date de la zero odata cu fiecare clasa, prefer convention over configuration, cat timp acele conventii sunt destul de aproape de conventiile proprii, pentru a minimiza boiler-plate code care doar zice ca o clasa Customer e mapata la o tabela cu acelasi nume si un “s” in coada.
      Acelasi lucru il ofera si NHibernate de multa vreme.

      La fel si la fielduri: in marea majoritate a cazurilor, voi avea tabele cu un surrogate primary key numit Id (autoincrement) sau EntityId, numele fieldului de obicei va coincide cunumele property-ului si orice foreign key de obicei il numesc OtherEntityId.

      Cand domain model-ul difera de database model, normal, vreau sa pot face override la conventii si sa definesc maparile manual.

      Custom conventions ar avea sens daca ma lovesc de vreun DB admin incapatanat care insista ca toate foreign key-urile sa fie botezate FK_TableId, tabelele TblNume, sau daca vreau sa atribui meaning-uri speciale la anumite field-uri prezente in toate tabelele: de ex. sa nu mai trebuiasca sa-i spun ca toate fieldurile numite CreatedBy, CreationDate, ModifiedBy, ModifiedDate trebuie automat setate cu o anumita valoare..

      • Andrei Ignat says:

        “ar avea sens daca ma lovesc de vreun DB admin incapatanat care insista ca toate foreign key-urile sa fie botezate FK_TableId, tabelele TblNume”
        mapping*ul asta il faci cu FLuentAPI si cu configurari in fisiere xml. Am facut asa ceva…
        “”sa nu mai trebuiasca sa-i spun ca toate fieldurile numite CreatedBy, CreationDate, ModifiedBy, ModifiedDate”
        clasele tale implementeaza un IHistory. Pre-salvare, layer-ul se uita la interfata si modifica…
        Hai ca nu e greu – si o stii si tu 😉

  2. Tudor Turcu says:

    Legat de ““ar avea sens daca ma lovesc de vreun DB admin incapatanat care insista ca toate foreign key-urile sa fie botezate FK_TableId, tabelele TblNume”
    mapping*ul asta il faci cu FLuentAPI si cu configurari in fisiere xml. Am facut asa ceva…”
    ———
    Poti specifica asta fara sa repeti maparea pentru fiecare tabela?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s