Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
No LINQ to SQL, o modelo de dados de um banco de dados relacional é mapeado para um modelo de objeto expresso na linguagem de programação de sua escolha. Quando o aplicativo é executado, o LINQ para SQL converte as consultas integradas ao idioma no modelo de objeto em SQL e as envia para o banco de dados para execução. Quando o banco de dados retorna os resultados, LINQ para SQL converte os resultados de volta para objetos com os quais você pode trabalhar em sua própria linguagem de programação.
Para traduzir dados entre o modelo de objeto e o banco de dados, um mapeamento de tipo deve ser definido. O LINQ to SQL usa um mapeamento de tipo para corresponder a cada tipo CLR (Common Language Runtime) com um tipo específico do SQL Server. Você pode definir mapeamentos de tipo e outras informações de mapeamento, como estrutura de banco de dados e relações de tabela, dentro do modelo de objeto com mapeamento baseado em atributo. Como alternativa, você pode especificar as informações de mapeamento fora do modelo de objeto com um arquivo de mapeamento externo. Para obter mais informações, consulte Attribute-Based Mapeamento e Mapeamento Externo.
Este tópico discute os seguintes pontos:
Mapeamento de tipo padrão
Você pode criar o modelo de objeto ou o arquivo de mapeamento externo automaticamente com o Designer Relacional de Objeto (Designer O/R) ou a ferramenta de linha de comando SQLMetal. Os mapeamentos de tipo padrão para essas ferramentas definem quais tipos CLR são escolhidos para fazer o mapeamento para colunas dentro do banco de dados do SQL Server. Para obter mais informações sobre como usar essas ferramentas, consulte Criando o modelo de objeto.
Você também pode usar o CreateDatabase método para criar um banco de dados do SQL Server com base nas informações de mapeamento no modelo de objeto ou no arquivo de mapeamento externo. Os mapeamentos de tipo padrão para o CreateDatabase método definem qual tipo de colunas do SQL Server são criadas para mapear para os tipos CLR no modelo de objeto. Para obter mais informações, consulte Como criar dinamicamente um banco de dados.
Matriz de comportamento do tempo de execução do mapeamento de tipo
O diagrama a seguir mostra o comportamento de runtime esperado de mapeamentos de tipo específicos quando os dados são recuperados ou salvos no banco de dados. Com exceção da serialização, o LINQ to SQL não dá suporte ao mapeamento entre os tipos de dados CLR ou SQL Server que não são especificados nesta matriz. Para obter mais informações sobre o suporte à serialização, consulte Serialização Binária.
Observação
Alguns mapeamentos de tipo podem resultar em estouro ou exceções de perda de dados ao converter para ou do banco de dados.
Mapeamento de tipo personalizado
Com o LINQ to SQL, você não está limitado aos mapeamentos de tipo padrão usados pelo Designer O/R, PELO SQLMetal e pelo CreateDatabase método. Você pode criar mapeamentos de tipo personalizados especificando-os explicitamente em um arquivo DBML. Em seguida, você pode usar esse arquivo DBML para criar o código do modelo de objeto e o arquivo de mapeamento. Para obter mais informações, consulte SQL-CLR Mapeamentos de tipo personalizados.
Diferenças de comportamento entre clr e execução de SQL
Devido às diferenças de precisão e execução entre o CLR e o SQL Server, você pode receber resultados diferentes ou ter um comportamento diferente dependendo de onde executar seus cálculos. Cálculos executados em consultas LINQ to SQL são convertidos em Transact-SQL e executados no banco de dados do SQL Server. Cálculos executados fora das consultas LINQ to SQL são executados no contexto do CLR.
Por exemplo, veja a seguir algumas diferenças de comportamento entre o CLR e o SQL Server:
O SQL Server ordena alguns tipos de dados de forma diferente dos dados do tipo equivalente no CLR. Por exemplo, os dados do tipo
UNIQUEIDENTIFIERdo SQL Server são ordenados de forma diferente dos dados CLR do tipo System.Guid.O SQL Server manipula algumas operações de comparação de cadeia de caracteres de forma diferente do CLR. No SQL Server, o comportamento de comparação de cadeia de caracteres depende das configurações de ordenação no servidor. Para obter mais informações, confira Como trabalhar com ordenações.
O SQL Server pode retornar valores diferentes para algumas funções mapeadas que o CLR. Por exemplo, as funções de igualdade serão diferentes porque o SQL Server considera duas cadeias de caracteres iguais se forem diferentes apenas no espaço em branco à direita; enquanto o CLR os considera não iguais.
Mapeamento de enumeração
O LINQ to SQL dá suporte ao mapeamento do tipo CLR System.Enum para tipos do SQL Server de duas maneiras:
Mapeamento para tipos numéricos SQL (
TINYINT,SMALLINT,INT,BIGINT)Quando você mapeia um tipo CLR System.Enum para um tipo numérico SQL, mapeia o valor inteiro subjacente do CLR System.Enum para o valor da coluna de banco de dados do SQL Server. Por exemplo, se um System.Enum nome
DaysOfWeekcontiver um membro nomeadoTuecom um valor inteiro subjacente de 3, esse membro será mapeado para um valor de banco de dados de 3.Mapeamento para tipos de texto SQL (
CHAR,NCHAR,VARCHAR,NVARCHAR)Quando você mapeia um tipo System.Enum CLR para um tipo de texto do SQL, o valor do banco de dados SQL é mapeado para os nomes dos membros do System.Enum CLR. Por exemplo, se um System.Enum nomeado
DaysOfWeekcontiver um membro nomeadoTuecom um valor inteiro subjacente de 3, esse membro será mapeado para um valor de banco de dados deTue.
Observação
Ao mapear tipos de texto SQL para um CLR System.Enum, inclua apenas os nomes dos Enum membros na coluna SQL mapeada. Não há suporte para outros valores na Enumcoluna SQL mapeada.
A ferramenta de linha de comando O/R Designer e SQLMetal não pode mapear automaticamente um tipo SQL para uma classe CLR Enum . Você deve configurar explicitamente esse mapeamento personalizando um arquivo DBML para uso pelo Designer O/R e pelo SQLMetal. Para obter mais informações sobre o mapeamento de tipo personalizado, consulte SQL-CLR Mapeamentos de Tipo Personalizado.
Como uma coluna SQL destinada à enumeração será do mesmo tipo que outras colunas numéricas e de texto, essas ferramentas não reconhecerão sua intenção e será feito o mapeamento padrão, conforme descrito nas seções Mapeamento Numérico e Mapeamento de Texto e XML a seguir. Para obter mais informações sobre como gerar código com o arquivo DBML, consulte a Geração de Código no LINQ to SQL.
O DataContext.CreateDatabase método cria uma coluna SQL de tipo numérico para mapear um tipo CLR System.Enum .
Mapeamento numérico
O LINQ to SQL permite mapear muitos tipos numéricos CLR e SQL Server. A tabela a seguir mostra os tipos CLR que o Designer O/R e o SQLMetal selecionam ao criar um modelo de objeto ou um arquivo de mapeamento externo com base em seu banco de dados.
| Tipo do SQL Server | Mapeamento de tipo CLR padrão usado pelo O/R Designer e pelo 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 |
A tabela a seguir mostra os mapeamentos de tipo padrão usados pelo DataContext.CreateDatabase método para definir qual tipo de colunas SQL são criadas para mapear para os tipos CLR definidos em seu modelo de objeto ou arquivo de mapeamento externo.
| Tipo CLR | Tipo de SQL Server padrão usado por 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 |
Há muitos outros mapeamentos numéricos que você pode escolher, mas alguns podem resultar em estouro ou exceções de perda de dados ao converter para ou do banco de dados. Para obter mais informações, consulte a matriz de comportamento em tempo de execução do mapeamento de tipos.
Tipos de decimal e dinheiro
A precisão padrão do tipo SQL Server DECIMAL (18 dígitos decimais à esquerda e à direita do ponto decimal) é muito menor do que a precisão do tipo CLR System.Decimal com o qual ele é emparelhado por padrão. Isso pode resultar em perda de precisão quando você salva dados no banco de dados. No entanto, exatamente o oposto pode acontecer se o tipo do SQL Server DECIMAL estiver configurado com mais de 29 dígitos de precisão. Quando um tipo do SQL Server DECIMAL foi configurado com uma precisão maior do que o CLR System.Decimal, a perda de precisão pode ocorrer ao recuperar dados do banco de dados.
O SQL Server MONEY e os tipos SMALLMONEY, que também são emparelhados por padrão com o tipo CLR System.Decimal, têm uma precisão bastante limitada, o que pode resultar em exceções de estouro de capacidade ou perda de dados ao gravar informações no banco de dados.
Mapeamento de texto e XML
Há também muitos tipos XML e baseados em texto que você pode mapear com LINQ para SQL. A tabela a seguir mostra os tipos CLR que o Designer O/R e o SQLMetal selecionam ao criar um modelo de objeto ou um arquivo de mapeamento externo com base em seu banco de dados.
| Tipo do SQL Server | Mapeamento de tipo CLR padrão usado pelo O/R Designer e pelo SQLMetal |
|---|---|
CHAR |
System.String |
NCHAR |
System.String |
VARCHAR |
System.String |
NVARCHAR |
System.String |
TEXT |
System.String |
NTEXT |
System.String |
XML |
System.Xml.Linq.XElement |
A tabela a seguir mostra os mapeamentos de tipo padrão usados pelo DataContext.CreateDatabase método para definir qual tipo de colunas SQL são criadas para mapear para os tipos CLR definidos em seu modelo de objeto ou arquivo de mapeamento externo.
| Tipo CLR | Tipo de SQL Server padrão usado por DataContext.CreateDatabase |
|---|---|
| System.Char | NCHAR(1) |
| System.String | NVARCHAR(4000) |
| System.Char[] | NVARCHAR(4000) |
Tipo personalizado implementando Parse() e ToString() |
NVARCHAR(MAX) |
Há muitos outros mapeamentos baseados em texto e XML que você pode escolher, mas alguns podem resultar em exceções de estouro ou perda de dados ao converter para ou a partir do banco de dados. Para obter mais informações, consulte a matriz de comportamento em tempo de execução do mapeamento de tipos.
Tipos XML
O tipo de dados do SQL Server XML está disponível a partir do Microsoft SQL Server 2005. Você pode mapear o tipo de dados do SQL Server XML para XElement, XDocumentou String. Se a coluna armazenar fragmentos XML que não podem ser lidos em XElement, a coluna deverá ser mapeada para String para evitar erros de tempo de execução. Fragmentos XML que devem ser mapeados para String incluir o seguinte:
Uma sequência de elementos XML
Atributos
Identificadores públicos (PI)
Comentários
Embora você possa mapear o XElement e o XDocument para o SQL Server conforme mostrado em Matriz de Comportamento em Tempo de Execução de Mapeamento de Tipo, o método DataContext.CreateDatabase não tem nenhum mapeamento padrão do tipo do SQL Server para esses tipos.
Tipos personalizados
Se uma classe implementa Parse() eToString(), você pode mapear o objeto para qualquer tipo de texto SQL (CHAR, , NCHAR, VARCHAR, NVARCHAR, TEXT, , NTEXT, ). XML O objeto é armazenado no banco de dados enviando o valor retornado por ToString() para a coluna de banco de dados mapeada. O objeto é reconstruído invocando Parse() na cadeia de caracteres retornada pelo banco de dados.
Observação
O LINQ to SQL não dá suporte à serialização usando System.Xml.Serialization.IXmlSerializable.
Mapeamento de data e hora
Com o LINQ to SQL, você pode mapear muitos tipos de data e hora do SQL Server. A tabela a seguir mostra os tipos CLR que o Designer O/R e o SQLMetal selecionam ao criar um modelo de objeto ou um arquivo de mapeamento externo com base em seu banco de dados.
| Tipo do SQL Server | Mapeamento de tipo CLR padrão usado pelo O/R Designer e pelo SQLMetal |
|---|---|
SMALLDATETIME |
System.DateTime |
DATETIME |
System.DateTime |
DATETIME2 |
System.DateTime |
DATETIMEOFFSET |
System.DateTimeOffset |
DATE |
System.DateTime |
TIME |
System.TimeSpan |
A tabela a seguir mostra os mapeamentos de tipo padrão usados pelo DataContext.CreateDatabase método para definir qual tipo de colunas SQL são criadas para mapear para os tipos CLR definidos em seu modelo de objeto ou arquivo de mapeamento externo.
| Tipo CLR | Tipo de SQL Server padrão usado por DataContext.CreateDatabase |
|---|---|
| System.DateTime | DATETIME |
| System.DateTimeOffset | DATETIMEOFFSET |
| System.TimeSpan | TIME |
Há muitos outros mapeamentos de data e hora que você pode escolher, mas alguns podem resultar em estouro ou exceções de perda de dados ao converter para ou do banco de dados. Para obter mais informações, consulte a matriz de comportamento em tempo de execução do mapeamento de tipos.
Observação
Os tipos DATETIME2, DATETIMEOFFSET, DATE e TIME do SQL Server estão disponíveis a partir do SQL Server 2008. O LINQ to SQL dá suporte ao mapeamento para esses novos tipos a partir do .NET Framework versão 3.5 SP1.
System.Datetime
O intervalo e a precisão do tipo CLR System.DateTime são maiores que o intervalo e a precisão do tipo SQL Server DATETIME , que é o mapeamento de tipo padrão para o DataContext.CreateDatabase método. Para ajudar a evitar exceções relacionadas a datas fora do intervalo de DATETIME, use DATETIME2, que está disponível a partir do Microsoft SQL Server 2008.
DATETIME2 pode corresponder ao intervalo e à precisão do CLR System.DateTime.
As datas do SQL Server não têm nenhum conceito de TimeZone, um recurso que tem suporte avançado no CLR. Os valores TimeZone são salvos como estão no banco de dados sem conversão de TimeZone, independentemente das informações de DateTimeKind originais. Quando os valores DateTime são recuperados do banco de dados, eles são carregados como estão em um DateTime com um DateTimeKind de Unspecified. Para obter mais informações sobre métodos com System.DateTime suporte, consulte Métodos System.DateTime.
System.TimeSpan
O Microsoft SQL Server 2008 e o .NET Framework 3.5 SP1 permitem mapear o tipo CLR System.TimeSpan para o tipo do SQL Server TIME . No entanto, há uma grande diferença entre o intervalo que o CLR System.TimeSpan dá suporte e o que o tipo do SQL Server TIME dá suporte. Os valores de mapeamento menores que 0 ou maiores que 23:59:59,9999999 horas para TIME do SQL resultará em exceções de estouro. Para obter mais informações, consulte Métodos System.TimeSpan.
No Microsoft SQL Server 2000 e no SQL Server 2005, você não pode mapear campos de banco de dados para TimeSpan. No entanto, as operações em TimeSpan são suportadas porque valores TimeSpan podem ser retornados da subtração de DateTime ou ser introduzidos em uma expressão como uma variável literal ou vinculada.
Mapeamento binário
Há muitos tipos do SQL Server que podem ser mapeados para o tipo System.Data.Linq.BinaryCLR. A tabela a seguir mostra os tipos do SQL Server que fazem com que o Designer O/R e o SQLMetal definam um tipo CLR System.Data.Linq.Binary ao criar um modelo de objeto ou um arquivo de mapeamento externo com base em seu banco de dados.
| Tipo do SQL Server | Mapeamento de tipo CLR padrão usado pelo O/R Designer e pelo SQLMetal |
|---|---|
BINARY(50) |
System.Data.Linq.Binary |
VARBINARY(50) |
System.Data.Linq.Binary |
VARBINARY(MAX) |
System.Data.Linq.Binary |
VARBINARY(MAX) com o FILESTREAM atributo |
System.Data.Linq.Binary |
IMAGE |
System.Data.Linq.Binary |
TIMESTAMP |
System.Data.Linq.Binary |
A tabela a seguir mostra os mapeamentos de tipo padrão usados pelo DataContext.CreateDatabase método para definir qual tipo de colunas SQL são criadas para mapear para os tipos CLR definidos em seu modelo de objeto ou arquivo de mapeamento externo.
| Tipo CLR | Tipo de SQL Server padrão usado por DataContext.CreateDatabase |
|---|---|
| System.Data.Linq.Binary | VARBINARY(MAX) |
| System.Byte | VARBINARY(MAX) |
| System.Runtime.Serialization.ISerializable | VARBINARY(MAX) |
Há muitos outros mapeamentos binários que você pode escolher, mas alguns podem resultar em estouro ou exceções de perda de dados ao converter para ou do banco de dados. Para obter mais informações, consulte a matriz de comportamento em tempo de execução do mapeamento de tipos.
SQL Server FILESTREAM
O FILESTREAM atributo para VARBINARY(MAX) colunas está disponível a partir do Microsoft SQL Server 2008; você pode mapeá-lo com LINQ para SQL a partir do .NET Framework versão 3.5 SP1.
Embora você possa mapear VARBINARY(MAX) colunas com o FILESTREAM atributo para Binary objetos, o DataContext.CreateDatabase método não pode criar colunas automaticamente com o FILESTREAM atributo. Para obter mais informações sobre FILESTREAM, consulte a Visão geral do FILESTREAM.
Serialização binária
Se uma classe implementar a ISerializable interface, você poderá serializar um objeto para qualquer campo binário do SQL (BINARY, , VARBINARY). IMAGE O objeto é serializado e desserializado de acordo com a forma como a ISerializable interface é implementada. Para obter mais informações, consulte Serialização Binária.
Mapeamento diverso
A tabela a seguir mostra os mapeamentos de tipo padrão para alguns tipos diversos que ainda não foram mencionados. A tabela a seguir mostra os tipos CLR que o Designer O/R e o SQLMetal selecionam ao criar um modelo de objeto ou um arquivo de mapeamento externo com base em seu banco de dados.
| Tipo do SQL Server | Mapeamento de tipo CLR padrão usado pelo O/R Designer e pelo SQLMetal |
|---|---|
UNIQUEIDENTIFIER |
System.Guid |
SQL_VARIANT |
System.Object |
A tabela a seguir mostra os mapeamentos de tipo padrão usados pelo DataContext.CreateDatabase método para definir qual tipo de colunas SQL são criadas para mapear para os tipos CLR definidos em seu modelo de objeto ou arquivo de mapeamento externo.
| Tipo CLR | Tipo de SQL Server padrão usado por DataContext.CreateDatabase |
|---|---|
| System.Guid | UNIQUEIDENTIFIER |
| System.Object | SQL_VARIANT |
O LINQ to SQL não dá suporte a outros mapeamentos de tipo para esses tipos diversos. Para obter mais informações, consulte a matriz de comportamento em tempo de execução do mapeamento de tipos.