LINQ to SQL NullReferenceException gotcha

In my DAL (Data Access Layer) assembly (a LINQ-to-SQL centric assembly) I used to insert object into the database like this

public void CreateMessage(MyApp.Entities.Message message)
{
    Message m = new Message(); // this is the LINQ-to-SQL generated Message class not the business entity class
    m.UserId = message.UserId;
    //...  set all the properties accordingly
    DataContext ctx = new DataContext();
    ctx.InsertOnSubmit(m);
    ctx.SubmitChanges();
}

Things worked fine but one day I said : Let’s make use of the partial classes feature available in .NET and simplify the above code. Easier said than done, I’ve created a file called DatabaseExtensions.cs in this DAL assembly and put code like this :

public partial class Message
{
    public Message(MyApp.Entities.Message message)
    {
        this.UserId = message.UserId;
        // ... set all the properties accordingly
    }
}

then in the other class :

public void CreateMessage(MyApp.Entities.Message message)
{
    Message m = new Message(message);
    DataContext ctx = new DataContext();
    ctx.InsertOnSubmit(m);
    ctx.SubmitChanges();
}

after some time I ran the code and forgot all these that I’ve done. At the third line of the CreateMessage method (the one with the InsertOnSubmit call) I always got a NullReferenceException although ctx was not null, m was not null and no property (that I knew about) of m was not null. WTF?!

WTF… WTF…

then it hit me : I supplied a non-default constructor (i.e.: a constructor WITH parameters to the Message class so the default constructor – auto generated by the LINQ designer would NOT be called).

The fix? Ultra-easy (see the bold-brown text below) :

public partial class Message
{
    public Message(MyApp.Entities.Message message) : this()
    {
        this.UserId = message.UserId;
        // ... set all the properties accordingly
    }
}

Yes, just that : call explicitly the default constructor and all’s well. Clean, simple and working code :)

HTH.

Expresii engleziste pe care le urasc

  • Trendul e ascendent (in loc de trend avem “tendinta” in limba romana ce naiba…)
  • Asta nu face sens (asta nu are sens – var. corecta – din engleza “doesn’t make sense”)
  • Nu fi patetic (nu fi jalnic – pathetic din engl. se traduce “jalnic”). Patetic inseamna plin de patos (ceva a la Vadim Tudor de exemplu – care intre noi fie vorba e si jalnic dar sa nu complicam exemplul :P )
  • Meeting (sedinta)
  • Briefing (informare)
  • Minimizare (prefer minimalizare)
  • Staff (personal)

si mai sunt dar o sa le scriu pe masura ce ma mai lovesc de ele..

Esti un programator bun?

.. daca da de unde stii?

Arunca un ochi aici si poti sa apreciezi singur.

Instantanee personale

… de expresii :

Codul, cel mai dureros, se loveste de programator nu de CPU. :)

Moldovenii la olimpiadă

Niște moldoveni la jocurile olimpice.

Proba de caiac-canoe.

Ăștia urcați pe un pod deasupra gârlei.

Pe sub pod trece echipajul de pe locul 1 moment în care moldovenii încep să strige : Muiii bă, muii!! Chizda mă-tii!! etc..nici un raspuns.
Pe sub pod trece echipajul de pe locul 2. Moldovenii iar: Sa vă futim mă!! Muii!! Etc..nici un raspuns.
Pe sub pod trece echipajul de pe locul 3. Moldovenii striga: Muii bă, muii! Chizda mă-tii!!

Echipajul de pe locul 3 ripostează: ba a mă-tii bă!!

La care moldovenii exclamă extaziați: ăștia sunt!!! HAI ROMÂNIA !!!

Cum sa slabesti. Repede.

Asa cum citeam mai demult undeva (chiar nu tin minte unde) un lucru poate fi realizat :

  • Bine
  • Repede
  • Ieftin

Doar ca din lista poti sa iti alegi doar doua elemente la un moment dat.

Cum sa slabesti repede

Cum sa slabesti repede

SATI = SA-TI stea in gat

Desi mai devreme scriam despre faptul ca unele lucruri gratis valoareaza exact cat costa, acum va voi povesti de ceva pe bani, pe multi bani chiar, care valoreaza si mai putin decat orice lucru gratis.

SATI este un serviciu de monitorizare a traficului web, “independent” (independent ca Sorin Oprescu desigur), platit. Pe langa faptul ca spre deosebire de Trafic.ro, Google Analytics samd. costa bani buni, merge lent, are gauri de securitate si mai nou crapa cand ti-e lumea mai draga. Si nu doar crapa (se mai intampla si la altii) dar cand crapa trage in jos si site-ul monitorizat (INACCEPTABIL!!!).

Acum cateva argumente in sprijinul celor de mai sus :

1. Nesigur : Cititi pe HackersBlog despre asta

2. Lent : Incarcati pagina (da, special nu am facut link la ele) :

http://www.sati.ro/index.php?page=rezultate     sau

http://www.sati.ro/index.php?page=rezultate&o=name&siteid=nespecificat&letter=toate&filter_class=4&filter_type_period=3&filter_period=2009-01-18

si veti vedea cat de lent poate fi. Paginile sunt accesibile prin www.sati.ro -> Rezultate SATI

3.  Instabil (iar a crapat) :

SATI crash

Va veti intreba de ce aceste site-uri platesc bani buni ca sa pateasca asa ceva… Pai in principal consider ca a fost o decizie “politica” doar ca sa nu fie afiliate Trafic.ro. Motive invocate au fost ca Trafic ar putea fura date legate de audienta lor, cuvinte cheie samd.

Sper ca site-urile ce platesc bani vor intelege ce greseala au facut si si-o vor remedia..

Editare ulterioara : A scris si Sorin Tudor un post despre asta

Editare ulterioara 2 : GUPI si Dondorici au scris si ei despre asta..

Follow

Get every new post delivered to your Inbox.