Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W LINQ to SQL model danych relacyjnej bazy danych jest mapowany na model obiektowy wyrażony w wybranym języku programowania. Po uruchomieniu aplikacji linQ to SQL tłumaczy zapytania zintegrowane z językiem w modelu obiektów na język SQL i wysyła je do bazy danych w celu wykonania. Gdy baza danych zwraca wyniki, LINQ to SQL tłumaczy wyniki z powrotem na obiekty, z którymi można pracować we własnym języku programowania.
Aby przetłumaczyć dane między modelem obiektów a bazą danych, należy zdefiniować mapowanie typów . LINQ to SQL używa mapowania typów, aby dopasować każdy typ środowiska uruchomieniowego języka wspólnego (CLR) z określonym typem programu SQL Server. Można zdefiniować mapowania typów i inne informacje o mapowaniu, takie jak struktura bazy danych i relacje tabel, wewnątrz modelu obiektów z mapowaniem opartym na atrybutach. Alternatywnie można określić informacje o mapowaniu poza modelem obiektów za pomocą pliku mapowania zewnętrznego. Aby uzyskać więcej informacji, zobacz Attribute-Based Mapowanie i Mapowanie zewnętrzne.
W tym temacie omówiono następujące kwestie:
Mapowanie typów domyślnych
Model obiektów lub plik mapowania zewnętrznego można utworzyć automatycznie za pomocą projektanta relacyjnego obiektów (O/R Designer) lub narzędzia wiersza polecenia SQLMetal. Domyślne mapowania typów dla tych narzędzi definiują, które typy CLR są wybierane do mapowania na kolumny w bazie danych programu SQL Server. Aby uzyskać więcej informacji na temat korzystania z tych narzędzi, zobacz Tworzenie modelu obiektów.
Możesz również użyć CreateDatabase metody , aby utworzyć bazę danych programu SQL Server na podstawie informacji o mapowaniu w modelu obiektów lub pliku mapowania zewnętrznego. Domyślne mapowania typów dla metody CreateDatabase określają, które typy kolumn na serwerze SQL są tworzone w celu odwzorowania na typy CLR w modelu obiektowego. Aby uzyskać więcej informacji, zobacz Instrukcje: dynamiczne tworzenie bazy danych.
Macierz zachowania mapowania typów w czasie wykonywania
Na poniższym diagramie przedstawiono oczekiwane zachowanie czasu wykonywania określonych mapowań typów, gdy dane są pobierane z bazy danych lub zapisywane w bazie danych. Z wyjątkiem serializacji LINQ to SQL nie obsługuje mapowania między żadnymi typami danych CLR lub SQL Server, które nie zostały określone w tej macierzy. Aby uzyskać więcej informacji na temat obsługi serializacji, zobacz Serializacja binarna.
Uwaga / Notatka
Niektóre mapowania typów mogą powodować przepełnienia lub wyjątki utraty danych podczas przesyłania do bazy danych lub pobierania z bazy danych.
Mapowanie typów niestandardowych
W przypadku LINQ to SQL nie jesteś ograniczony do domyślnych odwzorowań typów używanych przez projektanta O/R, SQLMetal i metodę CreateDatabase. Mapowania typów niestandardowych można tworzyć, jawnie określając je w pliku DBML. Następnie możesz użyć tego pliku DBML, aby utworzyć kod modelu obiektów i plik mapowania. Aby uzyskać więcej informacji, zobacz SQL-CLR mapowania typów niestandardowych.
Różnice między zachowaniem środowiska CLR i wykonywania SQL
Ze względu na różnice w precyzji i wykonywaniu między clR i SQL Server, mogą być wyświetlane różne wyniki lub różne zachowanie w zależności od tego, gdzie wykonujesz obliczenia. Obliczenia wykonywane w zapytaniach LINQ to SQL są w rzeczywistości tłumaczone na Transact-SQL, a następnie wykonywane w bazie danych programu SQL Server. Obliczenia wykonywane poza zapytaniami LINQ to SQL są wykonywane w kontekście środowiska CLR.
Na przykład poniżej przedstawiono pewne różnice w zachowaniu środowiska CLR i programu SQL Server:
Program SQL Server zamawia niektóre typy danych inaczej niż dane równoważnego typu w środowisku CLR. Na przykład dane typu
UNIQUEIDENTIFIER
programu SQL Server są uporządkowane inaczej niż dane CLR typu System.Guid.Program SQL Server obsługuje niektóre operacje porównania ciągów inaczej niż CLR. W programie SQL Server zachowanie porównania ciągów zależy od ustawień sortowania na serwerze. Aby uzyskać więcej informacji, zobacz Praca z kolacjami.
Program SQL Server może zwracać różne wartości dla niektórych zamapowanych funkcji niż CLR. Na przykład funkcje równości będą się różnić, ponieważ program SQL Server uważa, że dwa ciągi są równe, jeśli różnią się tylko końcowymi spacjami, podczas gdy CLR uważa, że nie są równe.
Mapowanie wyliczenia
LinQ to SQL obsługuje mapowanie typu CLR System.Enum na typy programu SQL Server na dwa sposoby:
Mapowanie na typy liczbowe SQL (
TINYINT
,SMALLINT
,INT
,BIGINT
)Podczas mapowania typu CLR System.Enum na typ liczbowy SQL mapujesz ukrytą wartość całkowitą CLR System.Enum na wartość kolumny w bazie danych SQL Server. Na przykład, jeśli System.Enum o nazwie
DaysOfWeek
zawiera element członkowski o nazwieTue
z wartością bazową całkowitą 3, ten element członkowski jest mapowany na wartość w bazie danych 3.Mapowanie na typy tekstu SQL (
CHAR
,NCHAR
,VARCHAR
,NVARCHAR
)Podczas mapowania typu CLR System.Enum na typ tekstu SQL wartość bazy danych SQL jest mapowana na nazwy elementów członkowskich CLR System.Enum . Jeśli na przykład System.Enum,
DaysOfWeek
zawiera element członkowski o nazwieTue
z bazową wartości całkowitą 3, ten element członkowski mapuje wartość bazy danych naTue
.
Uwaga / Notatka
Podczas mapowania typów tekstu SQL na CLR System.Enum należy uwzględnić tylko nazwy Enum członków w mapowanej kolumnie SQL. Inne wartości nie są obsługiwane w kolumnie SQL powiązanej z Enum.
Narzędzie wiersza polecenia O/R Designer i SQLMetal nie mogą automatycznie mapować typu SQL na klasę CLR Enum . Aby skonfigurować to mapowanie w sposób jawny, należy dostosować plik DBML do użycia przez projektanta O/R i SQLMetal. Aby uzyskać więcej informacji na temat niestandardowego mapowania typów, zobacz SQL-CLR Mapowania typów niestandardowych.
Ponieważ kolumna SQL przeznaczona do wyliczenia będzie mieć taki sam typ jak inne kolumny liczbowe i tekstowe, narzędzia te nie rozpoznają Twojej intencji i automatycznie zastosują mapowanie zgodnie z opisem w poniższych sekcjach Mapowanie liczbowe oraz Mapowanie tekstowe i XML. Aby uzyskać więcej informacji na temat generowania kodu za pomocą pliku DBML, zobacz Generowanie kodu w linQ to SQL.
Metoda DataContext.CreateDatabase tworzy kolumnę SQL typu liczbowego w celu mapowania typu CLR System.Enum .
Mapowanie liczbowe
LINQ to SQL umożliwia mapowanie wielu typów liczbowych CLR i SQL Server. W poniższej tabeli przedstawiono typy CLR wybrane przez projektanta O/R i sqlMetal podczas kompilowania modelu obiektów lub pliku mapowania zewnętrznego na podstawie bazy danych.
Typ programu SQL Server | Domyślne mapowanie typów CLR używane przez projektanta O/R i 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 |
W następnej tabeli pokazano domyślne mapowania typów używane przez metodę DataContext.CreateDatabase do określenia, które typy kolumn SQL są tworzone do mapowania na typy CLR zdefiniowane w Twoim modelu obiektów lub zewnętrznym pliku mapowania.
Typ CLR | Domyślny typ programu SQL Server używany przez program 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 |
Istnieje wiele innych mapowań liczbowych, które można wybrać, ale niektóre mogą powodować przepełnienie lub wyjątki utraty danych podczas konwersji do lub z bazy danych. Aby uzyskać więcej informacji, zapoznaj się z Macierzą zachowania w czasie wykonywania mapowania typów.
Typy dziesiętne i pieniężne
Domyślna precyzja typu programu SQL Server DECIMAL
(18 cyfr dziesiętnych z lewej i prawej strony punktu dziesiętnego) jest znacznie mniejsza niż precyzja typu CLR System.Decimal , z którym jest domyślnie sparowana. Może to spowodować utratę dokładności podczas zapisywania danych w bazie danych. Wręcz przeciwnie może się zdarzyć, jeśli typ SQL Server DECIMAL
zostanie skonfigurowany z dokładnością większą niż 29 cyfr. Jeśli typ programu SQL Server DECIMAL
został skonfigurowany z większą dokładnością niż CLR System.Decimal, utrata dokładności może wystąpić podczas pobierania danych z bazy danych.
SQL Server MONEY
i SMALLMONEY
, które domyślnie są powiązane z typem CLR System.Decimal, mają znacznie niższą precyzję, co może prowadzić do przepełnienia lub utraty danych podczas zapisywania danych w bazie danych.
Mapowanie tekstu i xml
Istnieje również wiele typów tekstowych i XML, które można mapować za pomocą linQ to SQL. W poniższej tabeli przedstawiono typy CLR wybrane przez projektanta O/R i sqlMetal podczas kompilowania modelu obiektów lub pliku mapowania zewnętrznego na podstawie bazy danych.
Typ programu SQL Server | Domyślne mapowanie typów CLR używane przez projektanta O/R i sqlMetal |
---|---|
CHAR |
System.String |
NCHAR |
System.String |
VARCHAR |
System.String |
NVARCHAR |
System.String |
TEXT |
System.String |
NTEXT |
System.String |
XML |
System.Xml.Linq.XElement |
W następnej tabeli pokazano domyślne mapowania typów używane przez metodę DataContext.CreateDatabase do określenia, które typy kolumn SQL są tworzone do mapowania na typy CLR zdefiniowane w Twoim modelu obiektów lub zewnętrznym pliku mapowania.
Typ CLR | Domyślny typ programu SQL Server używany przez program DataContext.CreateDatabase |
---|---|
System.Char | NCHAR(1) |
System.String | NVARCHAR(4000) |
System.Char[] | NVARCHAR(4000) |
Niestandardowy typ implementujący Parse() i ToString() |
NVARCHAR(MAX) |
Istnieje wiele innych mapowań tekstowych i XML, które można wybrać, ale niektóre mogą powodować przepełnienie lub wyjątki utraty danych przy przesyłaniu danych do lub z bazy danych. Aby uzyskać więcej informacji, zapoznaj się z Macierzą zachowania w czasie wykonywania mapowania typów.
Typy XML
Typ danych programu SQL Server XML
jest dostępny od programu Microsoft SQL Server 2005. Typ danych programu SQL Server XML
można mapować na XElement, XDocumentlub String. Jeśli kolumna przechowuje fragmenty XML, których nie można odczytać jako XElement, kolumna musi być zamapowana do String, aby uniknąć błędów czasu wykonywania. Fragmenty XML, które muszą być mapowane na String, obejmują następujące:
Sekwencja elementów XML
Atrybuty
Identyfikatory publiczne (PI)
Komentarze
Mimo że można mapować XElement i XDocument na program SQL Server, jak pokazano w macierzy zachowań czasu wykonywania mapowania typów, DataContext.CreateDatabase metoda nie ma domyślnego mapowania typów programu SQL Server dla tych typów.
Typy niestandardowe
Jeśli klasa implementuje Parse()
i ToString()
, można mapować obiekt na dowolny typ tekstu SQL (CHAR
, NCHAR
, , VARCHAR
NVARCHAR
TEXT
, , NTEXT
, XML
). Obiekt jest przechowywany w bazie danych, wysyłając wartość zwróconą przez ToString()
do zamapowanej kolumny bazy danych. Obiekt jest odtwarzany przez wywołanie Parse()
ciągu zwróconego przez bazę danych.
Uwaga / Notatka
LINQ to SQL nie obsługuje serializacji przy użyciu polecenia System.Xml.Serialization.IXmlSerializable.
Mapowanie daty i godziny
Za pomocą linQ to SQL można mapować wiele typów dat i godzin programu SQL Server. W poniższej tabeli przedstawiono typy CLR wybrane przez projektanta O/R i sqlMetal podczas kompilowania modelu obiektów lub pliku mapowania zewnętrznego na podstawie bazy danych.
Typ programu SQL Server | Domyślne mapowanie typów CLR używane przez projektanta O/R i sqlMetal |
---|---|
SMALLDATETIME |
System.DateTime |
DATETIME |
System.DateTime |
DATETIME2 |
System.DateTime |
DATETIMEOFFSET |
System.DateTimeOffset |
DATE |
System.DateTime |
TIME |
System.TimeSpan |
W następnej tabeli pokazano domyślne mapowania typów używane przez metodę DataContext.CreateDatabase do określenia, które typy kolumn SQL są tworzone do mapowania na typy CLR zdefiniowane w Twoim modelu obiektów lub zewnętrznym pliku mapowania.
Typ CLR | Domyślny typ programu SQL Server używany przez program DataContext.CreateDatabase |
---|---|
System.DateTime | DATETIME |
System.DateTimeOffset | DATETIMEOFFSET |
System.TimeSpan | TIME |
Istnieje wiele innych mapowań daty i godziny, które można wybrać, ale niektóre mogą powodować przepełnienie lub wyjątki utraty danych podczas tłumaczenia na bazę danych lub z niej. Aby uzyskać więcej informacji, zapoznaj się z Macierzą zachowania w czasie wykonywania mapowania typów.
Uwaga / Notatka
Typy programu DATETIME2
SQL Server, DATETIMEOFFSET
, DATE
i TIME
są dostępne od programu Microsoft SQL Server 2008. LinQ to SQL obsługuje mapowanie na te nowe typy, począwszy od programu .NET Framework w wersji 3.5 SP1.
System.Datetime
Zakres i precyzja typu CLR System.DateTime jest większa niż zakres i precyzja typu programu SQL Server DATETIME
, który jest domyślnym mapowaniem typów dla DataContext.CreateDatabase metody . Aby uniknąć wyjątków związanych z datami spoza zakresu DATETIME
, użyj programu DATETIME2
, który jest dostępny od programu Microsoft SQL Server 2008.
DATETIME2
może dorównywać zakresem i precyzją CLR System.DateTime.
Daty w SQL Server nie obsługują TimeZone, funkcji, która jest szeroko wspierana w środowisku CLR. TimeZone wartości są zapisywane bezpośrednio do bazy danych, bez TimeZone konwersji, niezależnie od oryginalnych DateTimeKind danych. Gdy wartości DateTime są pobierane z bazy danych, ich wartość jest ładowana bez zmian do obiektu DateTime z DateTimeKind o wartości Unspecified. Aby uzyskać więcej informacji na temat obsługiwanych System.DateTime metod, zobacz Metody System.DateTime.
System.TimeSpan
Programy Microsoft SQL Server 2008 i .NET Framework 3.5 SP1 umożliwiają mapowania typu CLR System.TimeSpan na typ programu SQL Server TIME
. Istnieje jednak duża różnica między zakresem, który obsługuje CLR System.TimeSpan , a tym, co obsługuje typ programu SQL Server TIME
. Mapowanie wartości mniejszych niż 0 lub większe niż 23:59:59.99999999 godzin dla bazy danych SQL TIME
spowoduje wyjątki przepełnienia. Aby uzyskać więcej informacji, zobacz Metody System.TimeSpan.
W programach Microsoft SQL Server 2000 i SQL Server 2005 nie można mapować pól bazy danych na TimeSpan. Jednak operacje na TimeSpan są obsługiwane, ponieważ wartości TimeSpan mogą być zwracane z działania odejmowania DateTime lub wprowadzane do wyrażenia jako wartość dosłowna lub zmienna powiązana.
Mapowanie binarne
Istnieje wiele typów programu SQL Server, które mogą być mapowane na typ System.Data.Linq.BinaryCLR. W poniższej tabeli przedstawiono typy programu SQL Server, które powodują, że projektant O/R i SQLMetal definiują typ CLR System.Data.Linq.Binary podczas kompilowania modelu obiektów lub pliku mapowania zewnętrznego na podstawie bazy danych.
Typ programu SQL Server | Domyślne mapowanie typów CLR używane przez projektanta O/R i sqlMetal |
---|---|
BINARY(50) |
System.Data.Linq.Binary |
VARBINARY(50) |
System.Data.Linq.Binary |
VARBINARY(MAX) |
System.Data.Linq.Binary |
VARBINARY(MAX) z atrybutem FILESTREAM |
System.Data.Linq.Binary |
IMAGE |
System.Data.Linq.Binary |
TIMESTAMP |
System.Data.Linq.Binary |
W następnej tabeli pokazano domyślne mapowania typów używane przez metodę DataContext.CreateDatabase do określenia, które typy kolumn SQL są tworzone do mapowania na typy CLR zdefiniowane w Twoim modelu obiektów lub zewnętrznym pliku mapowania.
Typ CLR | Domyślny typ programu SQL Server używany przez program DataContext.CreateDatabase |
---|---|
System.Data.Linq.Binary | VARBINARY(MAX) |
System.Byte | VARBINARY(MAX) |
System.Runtime.Serialization.ISerializable | VARBINARY(MAX) |
Istnieje wiele innych mapowań binarnych, które można wybrać, ale niektóre mogą prowadzić do przepełnienia lub wyjątków utraty danych podczas konwersji do lub z bazy danych. Aby uzyskać więcej informacji, zapoznaj się z Macierzą zachowania w czasie wykonywania mapowania typów.
SQL Server FILESTREAM
Atrybut FILESTREAM
kolumn VARBINARY(MAX)
jest dostępny począwszy od programu Microsoft SQL Server 2008, a mapowanie do niego przy użyciu LINQ to SQL jest możliwe począwszy od wersji 3.5 z dodatkiem SP1 programu .NET Framework.
Chociaż można mapować VARBINARY(MAX)
kolumny z atrybutem FILESTREAM
na Binary obiekty, DataContext.CreateDatabase metoda nie może automatycznie tworzyć kolumn z atrybutem FILESTREAM
. Aby uzyskać więcej informacji na temat FILESTREAM
, zobacz FILESTREAM Overview (Omówienie funkcji FILESTREAM).
Serializacja binarna
Jeśli klasa implementuje ISerializable interfejs, można serializować obiekt do dowolnego pola binarnego SQL (BINARY
, VARBINARY
, IMAGE
). Obiekt jest serializowany i deserializowany zgodnie z implementacją interfejsu ISerializable . Aby uzyskać więcej informacji, zobacz Serializacja binarna.
Mapowanie różnorodne
W poniższej tabeli przedstawiono domyślne mapowania typów dla niektórych różnych typów, które nie zostały jeszcze wymienione. W poniższej tabeli przedstawiono typy CLR wybrane przez projektanta O/R i sqlMetal podczas kompilowania modelu obiektów lub pliku mapowania zewnętrznego na podstawie bazy danych.
Typ programu SQL Server | Domyślne mapowanie typów CLR używane przez projektanta O/R i sqlMetal |
---|---|
UNIQUEIDENTIFIER |
System.Guid |
SQL_VARIANT |
System.Object |
W następnej tabeli pokazano domyślne mapowania typów używane przez metodę DataContext.CreateDatabase do określenia, które typy kolumn SQL są tworzone do mapowania na typy CLR zdefiniowane w Twoim modelu obiektów lub zewnętrznym pliku mapowania.
Typ CLR | Domyślny typ programu SQL Server używany przez program DataContext.CreateDatabase |
---|---|
System.Guid | UNIQUEIDENTIFIER |
System.Object | SQL_VARIANT |
LINQ to SQL nie obsługuje żadnych innych mapowań typów dla tych różnych typów. Aby uzyskać więcej informacji, zapoznaj się z Macierzą zachowania w czasie wykonywania mapowania typów.