ASP.NET MVC3 app (part 1) – Entity Framework and code first

How often you need to have cascading choices on UI in order to make your application user friendly? In my experience, almost every modern application has some form of hierarchy, and that is where cascading dropdowns are used. But, I want to make this less repetitive and more elegant. So, let’s begin. In first part (this) I will create an simple web app using entity framework code-first and make simple model which will be used for creating this functionality. It is one speedy run-through of new features, without advanced topics, so mind some bad practices, this blog post is not about good programming, first part is for MVC3/.NET 4 beginners with experience with older versions of MVC and .NET.

It will be an mvc3 razor internet application:

image

With latest MVC tools update there are already almost all necessary NuGet packages installed in new project:

image

I will just update all of jQuery packages as they have updates at the moment, and add EntityFramework.SqlServerCompact (NuGet will add dependencies), so SQL server won’t be needed.

As this is demo app, I will put everything into single project. It will be an product catalogue.

This is data model:

image

Central object will be product model (I will use vehicles domain), which has type, version, trim level and manufacturer. Simple enough. Objects on diagram are simple POCO objects with collection properties marked as virtual, so entity framework can override them and inject DynamicProxy objects for lazy loading.

This will be my repository:

image

For this DbContext to work, I need to do one more thing – to put connection string into my web.config:

image

As I don’t want to create test data every time I change my model, I can use database initializer class to create test data (this is useful for unit testing):

image

And this is it. I now have database and data. Actually, I will have it when I start my application, if I add this to global.asax:

image

To test this, I will use controller autoscaffold feature of new MVC tools update:

image

This will autocreate controller and all views Smile. After this action, starting app and visiting http://localhost:57095/Manufacturer will give:

image

Note that only manufacturers for which I created Models are in database. This is because I only added Models, and EF added all related objects, and BMW was not among them.

Using auto scaffold I created controllers for all model objects in couple of minutes.

This is end of part 1, I now have application which will I use to create unobtrusive cascading dropdowns. In the next part I will make cascading dropdown loading using standard methods (jQuery and ajax).

For more info about EF Code First, visit

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

and

http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

UPDATE: Added part 2

Take my work with me

How often did I need to copy whole virtual machine because I needed to continue work on another location? A way too often. And moments when I wait for 20-30GB to copy, sometimes seem like eternity.

Well, I spent couple minutes last night to prevent that 🙂

Here is a batch script which copies folder with my work from hdd and takes backup of database. Even more, it restores everything back when I arrive at another location 🙂

So, save this script as common.bat:

@echo off
set server=HOSTNAME\INSTANCE
set dbName=DATABASE
set projFolder="C:\Users\gorano\Documents\visual studio 2010\Projects"
set backupFolder=%CD%
 
if "%1"=="leaving" GOTO backup
if "%1"=="arriving" GOTO restore
echo Invalid first argument, must be "leaving" or "arriving"
GOTO end
 
:backup
echo backup database %dbName%
@echo on
sqlcmd -E -S %server% -Q "BACKUP DATABASE [%dbName%] TO  DISK = N'%backupFolder%\%dbName%.bak' WITH NOFORMAT, INIT, NAME = N'%dbName%-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
xcopy %projfolder% %backupFolder%\Projects  /E /I /Y /Q
GOTO end
 
:restore
if "%2"=="DeleteOld" GOTO deleteold
:restoreNoDelete
echo restore database %dbName%
sqlcmd -E -S %server% -Q "RESTORE DATABASE [%dbName%] FROM DISK = N'%backupFolder%\%dbName%.bak' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10"
xcopy %projfolder% %projfolder%.backup  /E /I /Y /Q
xcopy %backupFolder%\Projects %projfolder%  /E /I /Y /Q
GOTO end
 
:deleteold
@echo Press any key to delete database %dbName% on sql server %server%
pause
sqlcmd -E -S %server% -Q "ALTER DATABASE [%dbName%] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE"
sqlcmd -E -S %server% -Q "DROP REMOVETHISWORD DATABASE [%dbName%]"
GOTO restoreNoDelete
 
:end
pause

To run this easily, make “i’mleaving.bat” with

common leaving

and “i arrived.bat” with

common arriving DeleteOld

All you need to change is to set your server\instance, database name, folder with projects, and to delete “REMOVETHISWORD” under :deleteold, as words DROP and DATABASE does not stand well together (I don’t want to hack wordpress script injection protection to post this) 🙂
In combination with DropBox, this is great thing. You can also add 7z line to compress/decompress these files so dropbox sharing is more meaningfull (if you have large database).

Pravda iz m:tel-a – imate prijatelje :)

Čini se da ovaj sistem “dok ćutiš – j…. ćemo te” funkcioniše i kod nas, jer čak i giganti popuštaju kad se malo pobunimo. Iako sam ja svoju pobunu počeo davno prije Tunisa, Egipta i RS, tek sad je nastupio rezultat:

Odgovor m:tel-a na moj prigovor
Odgovor iz m:tel-a na moj prigovor

Šta da kažem nego – zadovoljan sam. Još da su im telefoni malo jeftiniji nego što su u prodavnicama… možda čak ne raskinem pretplatu jednog dana kada/ako mi firma vrati broj 🙂

Sad, mnogi će reći da 13 maraka (+PDV) i nije nešto značajno, ali to je 13 maraka (+PDV) koje ja NISAM potrošio a (greškom?) su mi naplaćene. Nije bitna količina, bitan je princip. I bitno je da bar nešto funkcioniše kako treba. Danas m:tel, a sutra će neko dobiti povrat novca za artikal koji je lažno reklamiran ili povrat obaveza koje je platio državi a zatvorio je preduzeće prije isteka uplaćenog perioda ili ima pravo na umanjenje… bitno je suprotstaviti se. Tek kada bude dovoljan broj onih koji se suprotstavljaju, a vjerujem da će ih biti, onda će onome ko odgovara na sve te prigovore dop….. pa će sistem da se popravi tako da se više ne čine te greške.

Update – 2011/02/14 16:10

Pošto sam dobio par pitanja u vezi svoje žalbe, pronašao sam i nju:

Prigovor koji sam poslao u m:tel povodom računa na kom nije obračunan bonus
Prigovor na račun iz m:tel-a

Jebem ti državu!

Dobijem ti ja uputnicu za ultrazvuk. Čuj dobijem, zaradim – nakon svetog januara dobijem glavobolju (a nikad me glava ne boli), izmjerim tlak kad ono oba preko 100. Odem kod svoje doktorke, dam malo krvi, vagnu me, kaže ti si debeo. Dobro, to sam znao. Kaže izgleda da ti je i jetra masna (ne bi me čudilo), al da mi budemo sigurni da nije šta drugo, aj ti na ultrazvuk. I tako ja dobijem tu uputnicu.
Naivan, kao i mnoga čeljad koja hoće da isprave krivu Drinu i da doprinesu da ovaj sistem bude bar malo bolji, naručiću se ja gore na Paprikovac. Kontam, bolje nek oni nešto rade, slabe su im plate, a i uslovi za rad. Nazovem klinički centar, tu mi dadnu jedan broj telefona. Nazovem taj broj, javi se teta kaže, eee mi smo u istoj zgradi al nije ovaj broj, zovi ovaj sad… (a nemate centralu???), al dobro, nazovem ja taj treći, opet se javi treća teta, kaže e to je to. Super, reko’ ja bih da se naručim na ultrazvuk. E, to ne može, evo već je 16h, nema sad ovde više nikog, sutra ti nazovi, al prije podne. Nazovem ja sutra, kažem tako, kaže meni četvrta teta ima termin za desetak dana (o, pa izgleda da oni imaju sasvim dovoljno pacijenata???), reko dobro, može tad, kaže ujutro u 8:00, nemoj doručkovati.
Dođe i taj dan, ja ustanem, spremim se, ne doručkujem i zapalim gore. Malo gužva usput, a malo (mnooooogo) i na parkingu, al stignem ja tamo, zakasnim samo 2 minuta. Predam knjižicu i uputnicu, i kaže meni teta 15 maraka košta pregled. Reko dobro, vadim pare, i kontam, a koliko bi tek koštao da mi ne odbija fond svaki mjesec 200-300 maraka od plate? Kaže meni teta, u stvari aj se ti prvo pregledaj pa ćeš onda da platiš (k’o da je znala…), idi gore do kraja hodnika pa lijevo.
Odem ja tamo, ono tu u tom hodniku rentgen, konsultacije za dojku, mamografija i ultrazvuk. Čeka tu masa naroda, al malo bolje pogledam većinom neko doveo ženu, neko majku, pitam jel čeka neko ultrazvuk, ono niko, svi gore na konsultacije i mamografiju. Dobro, pokucam uđem u ultrazvuk, ono nema nikog. Kaže čovjek ispred, maloprije izađe sestra. Sačekam ja još malo, nema nikog, a ja nervozan kad ne doručkujem. Vratim se tamo na recepciju, kažem nema nikoga tamo, odgovara mi teta, eto sad je sestra otišla. Ja opet tamo, stanem malo, još malo, izlazi sestra i kaže sjedi dečko i ode negdje. Ja kontam šta ja čekam ovdje, više me košta ovo vrijeme nego da platim sve što treba u privatnoj klinici, i odlučim, ode ja. Vratim se na recepciju, reko tako, sad je gotovo pola devet, ja da sam znao da je situacija ovakva, ja se gospođo ne bi ni naručivao. Kasnim na posao, treba li da vam šta platim? Kaže ona ne trebaš ništa, samo, jel vam dala sestra vašu knjižicu i uputnicu? Reko’ nije, jel mogu doći po to oko 17h? Kaže ajoj ne može, ček sad ću ja nju zvati. Nazove, čeka, niko se ne javlja, nazove drugi broj, treći, kaže momak mora na posao može li dobiti knjižicu, ova joj odgovara “šta bi mu ja”. Kaže meni ta teta tako je, doktor će doći sigurno do 11, pa ako može da tad dođeš ponovo, biće i knjižica? Hvala vam gospođo doviđenja! Donikad!
Napustio ja i bolnicu, i brdo, i kontam, učini mi žena uslugu. Ovdje, ko ima knjižicu ne može se osjećati bolje. A, ako nije crno, onda je bijelo. Evo ja se već osjećam bolje bez svoje. Sad bar znam na čemu sam, i mogu bar u to da se uzdam.

Omlet sa sirom i slaninom

Ponovo pišem recept, ništa ukusniji od prošlog (iako neki sumnjaju u moje prošlo remek djelo :)), ali ovoga puta malo sofisticiraniji. Vrlo jednostavno jelo, idealno za one koji ne znaju ama baš ništa u kuhinji 🙂

Za početak, potrebni resursi:

  • 2 jaja (kokošijih)
  • 200g svježeg sira
  • komad pancete (slanine)
  • list gauda sira
  • masline
  • ~ 15 minuta vremena

Algoritam:

  1. Staviti tavu da se grije sa par kapi ulja
  2. Razmutiti jaja (u tanjiru ili sl.)
  3. Ako se tava ugrijala, dodati jaja u tavu,
    u suprotnom ih dodati čim se ugrije 🙂
    (drugi thread radi dalje, ovaj ovde čeka
    i provjerava)
  4. Isjeći slaninu na sitne komadiće
  5. Isjeći masline na sitne komadiće
  6. Čim jaja počnu da koagulišu od
    temperature, dodati isjeckanu slaninu
    i masline
  7. Namazati svježi sir na gauda sir
  8. Presjeći gauda po pola, pa ga staviti
    na jaja
  9. Kada se gauda počne topiti, presaviti
    omlet, peći još minut i skinuti
  10. Jesti!
Jaja sa slaninom i maslinama
6. Jaja sa slaninom i maslinama
Svježi na gauda siru
7. Svježi na gauda siru

Sir dodan na omlet
8. Sir dodan na omlet

Omlet sa sirom i slaninom
Omlet sa sirom i slaninom