Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In LINQ to SQL il modello di dati di un database relazionale viene mappato a un modello a oggetti espresso nel linguaggio di programmazione preferito. Quando l'applicazione viene eseguita, LINQ to SQL converte le query integrate nel linguaggio nel modello a oggetti in SQL e le invia al database per l'esecuzione. Quando il database restituisce i risultati, LINQ to SQL converte i risultati in oggetti che è possibile usare nel proprio linguaggio di programmazione.
Per convertire i dati tra il modello a oggetti e il database, è necessario definire una mappatura dei tipi. LINQ to SQL usa un mapping dei tipi per corrispondere a ogni tipo CLR (Common Language Runtime) con un particolare tipo di SQL Server. È possibile definire mapping dei tipi e altre informazioni di mapping, ad esempio la struttura del database e le relazioni tra tabelle, all'interno del modello a oggetti con mapping basato su attributi. In alternativa, è possibile specificare le informazioni di mapping esterne al modello a oggetti con un file di mapping esterno. Per altre informazioni, vedere MappingAttribute-Based ed External Mapping.
In questo argomento vengono illustrati i punti seguenti:
Mapping dei tipi predefiniti
È possibile creare automaticamente il modello a oggetti o il file di mapping esterno con Progettazione relazionale oggetti (Progettazione O/R) o lo strumento da riga di comando SQLMetal. I mapping dei tipi predefiniti per questi strumenti definiscono quali tipi CLR vengono scelti per eseguire il mapping alle colonne all'interno del database di SQL Server. Per altre informazioni sull'uso di questi strumenti, vedere Creazione del modello a oggetti.
È anche possibile usare il CreateDatabase metodo per creare un database di SQL Server in base alle informazioni di mapping nel modello a oggetti o nel file di mapping esterno. I mapping dei tipi predefiniti per il metodo CreateDatabase definiscono quali tipi di colonne di SQL Server sono create per mappare ai tipi CLR nel modello a oggetti. Per altre informazioni, vedere Procedura: Creare dinamicamente un database.
Matrice del comportamento di run-time mapping dei tipi
Il diagramma seguente illustra il comportamento previsto in fase di esecuzione di mapping di tipi specifici quando i dati vengono recuperati o salvati nel database. Ad eccezione della serializzazione, LINQ to SQL non supporta il mapping tra tipi di dati CLR o SQL Server non specificati in questa matrice. Per altre informazioni sul supporto della serializzazione, vedere Serializzazione binaria.
Annotazioni
Alcune mappature dei tipi possono comportare eccezioni di overflow o perdita di dati traducendo da o verso il database.
Mappatura dei tipi personalizzati
Con LINQ to SQL, non sei limitato ai mapping dei tipi predefiniti usati dalla Progettazione O/R, SQLMetal e il metodo CreateDatabase. È possibile creare mapping di tipi personalizzati specificandoli in modo esplicito in un file DBML. È quindi possibile usare il file DBML per creare il codice del modello a oggetti e il file di mapping. Per altre informazioni, vedere SQL-CLR Mappature di tipi personalizzate.
Differenze di comportamento tra CLR ed esecuzione SQL
A causa delle differenze di precisione ed esecuzione tra CLR e SQL Server, è possibile che si ricevano risultati diversi o si verifichi un comportamento diverso a seconda della posizione in cui si eseguono i calcoli. I calcoli eseguiti nelle query LINQ to SQL vengono effettivamente convertiti in Transact-SQL e quindi eseguiti nel database di SQL Server. I calcoli eseguiti all'esterno delle query LINQ to SQL vengono eseguiti nel contesto di CLR.
Di seguito sono riportate alcune differenze di comportamento tra CLR e SQL Server:
SQL Server ordina alcuni tipi di dati in modo diverso rispetto ai dati di tipo equivalente in CLR. Ad esempio, i dati di SQL Server di tipo
UNIQUEIDENTIFIER
vengono ordinati in modo diverso rispetto ai dati CLR di tipo System.Guid.SQL Server gestisce alcune operazioni di confronto tra stringhe in modo diverso rispetto a CLR. In SQL Server il comportamento di confronto delle stringhe dipende dalle impostazioni delle regole di confronto nel server. Per altre informazioni, vedere Uso delle regole di confronto.
SQL Server può restituire valori diversi per alcune funzioni mappate rispetto a CLR. Ad esempio, le funzioni di uguaglianza variano perché SQL Server considera due stringhe uguali se differiscono solo in spazi vuoti finali; mentre CLR li considera non uguali.
Mappatura Enum
LINQ to SQL supporta il mapping del tipo CLR System.Enum ai tipi di SQL Server in due modi:
Mappatura a tipi numerici SQL (
TINYINT
,SMALLINT
,INT
,BIGINT
)Quando si esegue il mapping di un tipo CLR System.Enum a un tipo numerico SQL, si esegue il mapping del valore intero sottostante di CLR System.Enum al valore della colonna di database di SQL Server. Ad esempio, se un System.Enum oggetto denominato
DaysOfWeek
contiene un membro denominatoTue
con un valore intero sottostante pari a 3, tale membro esegue il mapping a un valore di database pari a 3.Mapping dei tipi di testo SQL (
CHAR
,NCHAR
,VARCHAR
,NVARCHAR
)Quando si esegue il mapping di un tipo CLR System.Enum a un tipo di testo SQL, viene eseguito il mapping del valore del database SQL ai nomi dei membri CLR System.Enum . Ad esempio, se un elemento di tipo System.Enum denominato
DaysOfWeek
contiene un membro denominatoTue
con un valore intero sottostante pari a 3, quel membro esegue il mapping a un valore di database pari aTue
.
Annotazioni
Quando si esegue il mapping dei tipi di testo SQL a un CLR System.Enum, includere solo i nomi dei Enum membri nella colonna SQL mappata. Gli altri valori non sono supportati nella Enumcolonna SQL mappata.
Lo strumento da riga di comando O/R Designer e SQLMetal non può eseguire automaticamente il mapping di un tipo SQL a una classe CLR Enum . È necessario configurare esplicitamente questo mapping personalizzando un file DBML per l'utilizzo con O/R Designer e SQLMetal. Per ulteriori informazioni sui mapping dei tipi personalizzati, vedere SQL-CLR Mapping dei Tipi Personalizzati.
Poiché una colonna SQL destinata all'enumerazione sarà dello stesso tipo di altre colonne numeriche e di testo, questi strumenti non riconosceranno la tua intenzione e imposteranno la mappatura predefinita come descritto nelle sezioni Mapping numerico e Mapping di testo e XML seguenti. Per altre informazioni sulla generazione di codice con il file DBML, vedere Generazione di codice in LINQ to SQL.
Il DataContext.CreateDatabase metodo crea una colonna SQL di tipo numerico per eseguire il mapping di un tipo CLR System.Enum .
Mapping Numerico
LINQ to SQL consente di eseguire il mapping di molti tipi numerici CLR e SQL Server. Nella tabella seguente vengono illustrati i tipi CLR selezionati da Progettazione O/R e SQLMetal durante la compilazione di un modello a oggetti o un file di mapping esterno in base al database.
Tipo di SQL Server | Mapping dei tipi CLR predefinito usato da Progettazione O/R e SQLMetal |
---|---|
BIT |
System.Boolean |
TINYINT |
System.Int16 |
INT |
System.Int32 |
BIGINT |
System.Int64 |
SMALLMONEY |
System.Decimal |
MONEY |
System.Decimal |
DECIMAL |
System.Decimal |
NUMERIC |
System.Decimal |
REAL/FLOAT(24) |
System.Single |
FLOAT/FLOAT(53) |
System.Double |
Nella tabella successiva vengono illustrati i mapping dei tipi predefiniti usati dal DataContext.CreateDatabase metodo per definire il tipo di colonne SQL create per eseguire il mapping ai tipi CLR definiti nel modello a oggetti o nel file di mapping esterno.
Tipo CLR | Tipo di SQL Server predefinito usato da DataContext.CreateDatabase |
---|---|
System.Boolean | BIT |
System.Byte | TINYINT |
System.Int16 | SMALLINT |
System.Int32 | INT |
System.Int64 | BIGINT |
System.SByte | SMALLINT |
System.UInt16 | INT |
System.UInt32 | BIGINT |
System.UInt64 | DECIMAL(20) |
System.Decimal | DECIMAL(29,4) |
System.Single | REAL |
System.Double | FLOAT |
È possibile scegliere molti altri mapping numerici, ma alcuni possono causare eccezioni di overflow o perdita di dati durante la conversione da o verso il database. Per ulteriori informazioni, vedere la Matrice del comportamento di runtime mapping dei tipi.
Tipi decimali e tipi monetari
La precisione predefinita del tipo di SQL Server DECIMAL
(18 cifre decimali a sinistra e a destra del separatore decimale) è molto più piccola della precisione del tipo CLR System.Decimal a cui è associata per impostazione predefinita. Ciò può comportare una perdita di precisione quando si salvano i dati nel database. Tuttavia, solo l'opposto può verificarsi se il tipo di SQL Server DECIMAL
è configurato con più di 29 cifre di precisione. Quando un tipo di SQL Server DECIMAL
è stato configurato con una maggiore precisione rispetto a CLR System.Decimal, la perdita di precisione può verificarsi durante il recupero dei dati dal database.
I tipi SQL Server MONEY
e SMALLMONEY
, associati anche al tipo CLR System.Decimal per impostazione predefinita, hanno una precisione molto inferiore, che può causare eccezioni di overflow o perdita di dati quando si salvano i dati nel database.
Mappatura del testo e XML
Esistono anche molti tipi basati su testo e XML che possono essere mappati con LINQ to SQL. Nella tabella seguente vengono illustrati i tipi CLR selezionati da Progettazione O/R e SQLMetal durante la compilazione di un modello a oggetti o un file di mapping esterno in base al database.
Tipo di SQL Server | Mapping dei tipi CLR predefinito usato da Progettazione O/R e SQLMetal |
---|---|
CHAR |
System.String |
NCHAR |
System.String |
VARCHAR |
System.String |
NVARCHAR |
System.String |
TEXT |
System.String |
NTEXT |
System.String |
XML |
System.Xml.Linq.XElement |
Nella tabella successiva vengono illustrati i mapping dei tipi predefiniti usati dal DataContext.CreateDatabase metodo per definire il tipo di colonne SQL create per eseguire il mapping ai tipi CLR definiti nel modello a oggetti o nel file di mapping esterno.
Tipo CLR | Tipo di SQL Server predefinito usato da DataContext.CreateDatabase |
---|---|
System.Char | NCHAR(1) |
System.String | NVARCHAR(4000) |
System.Char[] | NVARCHAR(4000) |
Tipo personalizzato che implementa Parse() e ToString() |
NVARCHAR(MAX) |
È possibile scegliere molti altri mapping basati su testo e XML, ma alcuni possono causare eccezioni di overflow o perdita di dati durante la conversione da o verso il database. Per ulteriori informazioni, vedere la Matrice del comportamento di runtime mapping dei tipi.
Tipi XML
Il tipo di dati di SQL Server XML
è disponibile a partire da Microsoft SQL Server 2005. È possibile eseguire il mapping del tipo di dati di SQL Server XML
a XElement, XDocumento String. Se la colonna archivia frammenti XML che non possono essere letti in XElement, è necessario eseguire il mapping della colonna a String, per evitare errori di run-time. I frammenti XML che devono essere mappati su String includono i seguenti:
Sequenza di elementi XML
Attributi
Identificatori pubblici (PI)
Commenti
Sebbene sia possibile eseguire il mapping di XElement e XDocument su SQL Server, come illustrato nella matrice del comportamento in fase di esecuzione del mapping dei tipi, il metodo DataContext.CreateDatabase non ha alcun mapping predefinito dei tipi di SQL Server per questi tipi.
Tipi personalizzati
Se una classe implementa Parse()
e ToString()
, è possibile eseguire il mapping dell'oggetto a qualsiasi tipo di testo SQL (CHAR
, NCHAR
VARCHAR
, NVARCHAR
TEXT
, NTEXT
). XML
L'oggetto viene archiviato nel database inviando il valore restituito dalla ToString()
colonna di database mappata. L'oggetto viene ricostruito richiamando Parse()
la stringa restituita dal database.
Annotazioni
LINQ to SQL non supporta la serializzazione tramite System.Xml.Serialization.IXmlSerializable.
Mappatura di data e ora
Con LINQ to SQL è possibile eseguire il mapping di molti tipi di data e ora di SQL Server. Nella tabella seguente vengono illustrati i tipi CLR selezionati da Progettazione O/R e SQLMetal durante la compilazione di un modello a oggetti o un file di mapping esterno in base al database.
Tipo di SQL Server | Mapping dei tipi CLR predefinito usato da Progettazione O/R e SQLMetal |
---|---|
SMALLDATETIME |
System.DateTime |
DATETIME |
System.DateTime |
DATETIME2 |
System.DateTime |
DATETIMEOFFSET |
System.DateTimeOffset |
DATE |
System.DateTime |
TIME |
System.TimeSpan |
Nella tabella successiva vengono illustrati i mapping dei tipi predefiniti usati dal DataContext.CreateDatabase metodo per definire il tipo di colonne SQL create per eseguire il mapping ai tipi CLR definiti nel modello a oggetti o nel file di mapping esterno.
Tipo CLR | Tipo di SQL Server predefinito usato da DataContext.CreateDatabase |
---|---|
System.DateTime | DATETIME |
System.DateTimeOffset | DATETIMEOFFSET |
System.TimeSpan | TIME |
È possibile scegliere molti altri mapping di data e ora, ma alcuni possono causare eccezioni di overflow o perdita di dati durante la conversione da o verso il database. Per ulteriori informazioni, vedere la Matrice del comportamento di runtime mapping dei tipi.
Annotazioni
I tipi DATETIME2
di SQL Server , DATETIMEOFFSET
, DATE
e TIME
sono disponibili a partire da Microsoft SQL Server 2008. LINQ to SQL supporta il mapping a questi nuovi tipi a partire da .NET Framework versione 3.5 SP1.
System.Datetime
L'intervallo e la precisione del tipo CLR System.DateTime sono maggiori dell'intervallo e della precisione del tipo SQL Server DATETIME
, ovvero il mapping dei tipi predefinito per il DataContext.CreateDatabase metodo . Per evitare eccezioni correlate a date esterne all'intervallo di DATETIME
, usare DATETIME2
, disponibile a partire da Microsoft SQL Server 2008.
DATETIME2
può corrispondere all'intervallo e alla precisione di CLR System.DateTime.
Le date di SQL Server non hanno alcun concetto di TimeZone, una funzionalità supportata in modo avanzato in CLR. TimeZone i valori vengono salvati così come sono nel database senza TimeZone conversione, indipendentemente dalle informazioni originali DateTimeKind . Quando DateTime i valori vengono recuperati dal database, il loro valore viene caricato esattamente come è in un DateTime con un DateTimeKind di Unspecified. Per altre informazioni sui metodi supportati System.DateTime , vedere Metodi System.DateTime.
System.TimeSpan
Microsoft SQL Server 2008 e .NET Framework 3.5 SP1 consentono di eseguire il mapping del tipo CLR System.TimeSpan al tipo di SQL Server TIME
. Tuttavia, esiste una grande differenza tra l'intervallo supportato da CLR System.TimeSpan e il tipo di SQL Server TIME
supportato. Il mapping dei valori minori di 0 o maggiori di 23:59:59.9999999 ore su SQL TIME
comporterà eccezioni di overflow. Per altre informazioni, vedere Metodi System.TimeSpan.
In Microsoft SQL Server 2000 e SQL Server 2005 non è possibile eseguire il mapping dei campi del database a TimeSpan. Tuttavia, le operazioni su TimeSpan sono supportate perché TimeSpan i valori possono essere restituiti dalla DateTime sottrazione o introdotti in un'espressione come variabile letterale o associata.
Mappatura binaria
Esistono molti tipi di SQL Server che possono eseguire il mapping al tipo System.Data.Linq.BinaryCLR . Nella tabella seguente vengono illustrati i tipi di SQL Server che causano la definizione di un tipo CLR System.Data.Linq.Binary da parte di Progettazione O/R e SQLMetal durante la compilazione di un modello a oggetti o un file di mapping esterno basato sul database.
Tipo di SQL Server | Mapping dei tipi CLR predefinito usato da Progettazione O/R e SQLMetal |
---|---|
BINARY(50) |
System.Data.Linq.Binary |
VARBINARY(50) |
System.Data.Linq.Binary |
VARBINARY(MAX) |
System.Data.Linq.Binary |
VARBINARY(MAX) con l'attributo FILESTREAM |
System.Data.Linq.Binary |
IMAGE |
System.Data.Linq.Binary |
TIMESTAMP |
System.Data.Linq.Binary |
Nella tabella successiva vengono illustrati i mapping dei tipi predefiniti usati dal DataContext.CreateDatabase metodo per definire il tipo di colonne SQL create per eseguire il mapping ai tipi CLR definiti nel modello a oggetti o nel file di mapping esterno.
Tipo CLR | Tipo di SQL Server predefinito usato da DataContext.CreateDatabase |
---|---|
System.Data.Linq.Binary | VARBINARY(MAX) |
System.Byte | VARBINARY(MAX) |
System.Runtime.Serialization.ISerializable | VARBINARY(MAX) |
È possibile scegliere molti altri mapping binari, ma alcuni possono comportare eccezioni di overflow o perdita di dati durante la conversione da o verso il database. Per ulteriori informazioni, vedere la Matrice del comportamento di runtime mapping dei tipi.
SQL Server FILESTREAM
L'attributo FILESTREAM
per VARBINARY(MAX)
le colonne è disponibile a partire da Microsoft SQL Server 2008. È possibile eseguirne il mapping con LINQ to SQL a partire da .NET Framework versione 3.5 SP1.
Sebbene sia possibile eseguire il mapping VARBINARY(MAX)
delle colonne con l'attributo FILESTREAM
agli Binary oggetti, il DataContext.CreateDatabase metodo non è in grado di creare automaticamente colonne con l'attributo FILESTREAM
. Per ulteriori informazioni su FILESTREAM
, vedere Cenni preliminari su FILESTREAM.
Serializzazione binaria
Se una classe implementa l'interfaccia ISerializable , è possibile serializzare un oggetto in qualsiasi campo binario SQL (BINARY
, VARBINARY
, IMAGE
). L'oggetto viene serializzato e deserializzato in base alla modalità di implementazione dell'interfaccia ISerializable . Per altre informazioni, vedere Serializzazione binaria.
Mappatura Diversa
Nella tabella seguente vengono illustrati i mapping dei tipi predefiniti per alcuni tipi vari che non sono ancora stati menzionati. Nella tabella seguente vengono illustrati i tipi CLR selezionati da Progettazione O/R e SQLMetal durante la compilazione di un modello a oggetti o un file di mapping esterno in base al database.
Tipo di SQL Server | Mapping dei tipi CLR predefinito usato da Progettazione O/R e SQLMetal |
---|---|
UNIQUEIDENTIFIER |
System.Guid |
SQL_VARIANT |
System.Object |
Nella tabella successiva vengono illustrati i mapping dei tipi predefiniti usati dal DataContext.CreateDatabase metodo per definire il tipo di colonne SQL create per eseguire il mapping ai tipi CLR definiti nel modello a oggetti o nel file di mapping esterno.
Tipo CLR | Tipo di SQL Server predefinito usato da DataContext.CreateDatabase |
---|---|
System.Guid | UNIQUEIDENTIFIER |
System.Object | SQL_VARIANT |
LINQ to SQL non supporta altre mappature dei tipi per questi tipi vari. Per ulteriori informazioni, vedere la Matrice del comportamento di runtime mapping dei tipi.