LINQ to SQL je skvělá volba. Bezpochyby. I naprostý amatér si "nakliká" DBML soubor a může používat objekty namísto toho, aby pracoval přímo s ADO.NET. Myšlenka jistě dobrá. Na LINQ to SQL nicméně existuje několik věcí, které mě při jeho používání nevýslovně štvou.
Výchozí hodnoty po inicializaci
Při návrhu databáze se pochopitelně vyhýbám hodnotám NULL všude, kde můžu, a často používám DEFAULT hodnoty. Takže, fragment, dejme tomu, tabulky faktur by mohl vypadat nějak takhle:
CREATE TABLE FAKTURA(
ID int NOT NULL IDENTITY (1,1),
DATUM datetime NOT NULL DEFAULT getdate(),
CENA money NOT NULL DEFAULT 0,
ODBERATEL varchar (50) NOT NULL DEFAULT 0,
CONSTRAINT PK_FAKTURA PRIMARY KEY CLUSTERED (ID)
)
Z čehož mi LINQ vygeneruje DBML soubor s přibližně tímto obsahem:
<Table Name="dbo.FAKTURA" Member="FAKTURAs">
<Type Name="FAKTURA">
<Column Name="ID" AutoSync="Never" Type="System.Int32" DbType="Int NOT NULL" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
<Column Name="DATUM" AutoSync="Never" Type="System.DateTime" DbType="DateTime NOT NULL" CanBeNull="false" />
<Column Name="CENA" Type="System.Decimal" DbType="Money NOT NULL" CanBeNull="false" />
<Column Name="ODBERATEL" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
</Type>
</Table>
Poměrně hloupé, není liž pravda? Pochopitelně, při jakémkoli pokusu vytvořit fakturu následujícím způsobem skončíte na chybě:
Dim myFaktura As FAKTURA = New FAKTURA
myFaktura.DATUM = #1/1/2008#
d.FAKTURAs.InsertOnSubmit(myFaktura)
Try
d.SubmitChanges()
Catch ex As Exception
Debug.Print(ex.ToString)
End Try
z toho prostého důvodu, že jste neinicializovali některé vlastnosti, LINQ to SQL je nedoplnil, pokusil se poslat do databáze v jistých sloupcích hodnoty NULL a ono to selhalo. Řešení je sice prosté, máme partial classes, kde se to dá nainicializovat, ale kdo se s tím má otravovat?
Partial Class Faktura
Private Sub OnCreated()
Me.CENA = 0
Me.DATUM = Today
Me.ODBERATEL = ""
End Sub
End Class
Máte někdo řešení, jak z toho ven?