In questo piccolo post vorrei mostrarvi un modo per recuperare, dato il tipo di un oggetto generato con il designer di Lnq2SQL, la tabella di mapping e le eventuali colonne di mapping delle singole proprietà.
Quando generiamo il modello dei dati in Linq2SQL, l’ambiente di sviluppo crea per noi il codice VB.NET per la definizione delle classi che mappano le nostre tabelle e il DataContext per accedere alla banca dati.
Supponiamo di avere una tabella di clienti:
e di generare il modello Linq2SQL. In questo caso Visual Studio genera per noi una classe Clienti:
- <Table(Name:="dbo.Clienti")> _
- Partial Public Class Clienti
- Implements System.ComponentModel.INotifyPropertyChanging, _
- System.ComponentModel.INotifyPropertyChanged
- .
- .
- <Column(Storage:="_IDCliente", AutoSync:=AutoSync.OnInsert, DbType:="Int NOT NULL IDENTITY", IsPrimaryKey:=True, IsDbGenerated:=True)> _
- Public Property IDCliente() As Integer
- .
- .
- End Property
- <Column(Storage:="_CodiceCliente", DbType:="Char(10) NOT NULL", CanBeNull:=False)> _
- Public Property CodiceCliente() As String
- .
- .
- End Property
- <Column(Storage:="_DescrizioneCliente", DbType:="NVarChar(100) NOT NULL", CanBeNull:=False)> _
- Public Property DescrizioneCliente() As String
- .
- .
- End Property
- .
- .
- End Class
Come possiamo osservare, la classe e le proprietà della stessa, vengono decorate con appositi attributi che mappano la classe e i suoi membri sulla tabella e sui campi della banca dati.
In particolare TableAttribute (Table nel precedente codice) associa la classe alla tabella (“dbo.Clienti” nell’esempio precedente) mentre ColumnAttribute (Column nel precedente codice) associa una proprietà ad un campo della banca dati.
Per recuperare, quindi, a runtime i parametri di mapping delle classi con la banca dati, possiamo recuperare gli attributi di cui sopra.
Per fare questo possiamo utilizzare i due seguenti metodi di estensione:
- Imports System.Runtime.CompilerServices
- Imports System.Data.Linq.Mapping
- Public Module Linq2SqlModule
- <Extension()> _
- Public Function GetLinq2SqlTable(ByVal objectType As Type) As String
- Dim retval As String = Nothing
- Try
- Dim attrib = CType(objectType.GetCustomAttributes(GetType(TableAttribute), _
- True).FirstOrDefault(), _
- TableAttribute)
- If attrib IsNot Nothing Then
- retval = attrib.Name
- End If
- Catch ex As Exception
- retval = Nothing
- End Try
- Return retval
- End Function
- <Extension()> _
- Public Function GetLinq2SqlField(ByVal objectType As Type, _
- ByVal propertyName As String) As String
- Dim retval As String = Nothing
- Try
- Dim entityProp = (From p In objectType.GetProperties() _
- Where String.Compare(p.Name, propertyName, True) = 0 _
- Select p).FirstOrDefault()
- If entityProp IsNot Nothing Then
- Dim attrib = CType(entityProp.GetCustomAttributes(GetType(ColumnAttribute), _
- True).FirstOrDefault(), _
- ColumnAttribute)
- If attrib IsNot Nothing Then
- retval = attrib.Storage.Replace("_", "")
- End If
- End If
- Catch ex As Exception
- retval = Nothing
- End Try
- Return retval
- End Function
- End Module
Commenti