Sdílet prostřednictvím


Mapování typů SQL a CLR

V LINQ to SQL se datový model relační databáze mapuje na objektový model vyjádřený v programovacím jazyce podle vašeho výběru. Při spuštění aplikace linQ to SQL přeloží dotazy integrované v jazyce v objektovém modelu do SQL a odešle je do databáze pro spuštění. Když databáze vrátí výsledky, LINQ to SQL přeloží výsledky zpět na objekty, se kterými můžete pracovat ve vlastním programovacím jazyce.

Aby bylo možné přeložit data mezi objektovým modelem a databází, musí být definováno mapování typu. LINQ to SQL používá mapování typů, které odpovídá každému typu CLR (Common Language Runtime) s konkrétním typem SQL Serveru. Můžete definovat mapování typů a další informace o mapování, jako je struktura databáze a relace mezi tabulkami, uvnitř objektového modelu s mapováním založeným na atributech. Případně můžete zadat informace o mapování mimo objektový model pomocí externího souboru mapování. Další informace naleznete v tématu Mapování na základě atributů a externí mapování.

Toto téma popisuje následující body:

Výchozí mapování typů

Objektový model nebo externí soubor mapování můžete vytvořit automaticky pomocí Návrhář relací objektů (Návrhář relací objektů) nebo nástroje příkazového řádku SQLMetal. Výchozí mapování typů pro tyto nástroje definují, které typy CLR se mají mapovat na sloupce uvnitř databáze SQL Serveru. Další informace o použití těchto nástrojů naleznete v tématu Vytvoření objektového modelu.

Metodu CreateDatabase můžete použít také k vytvoření databáze SQL Serveru na základě informací o mapování v objektovém modelu nebo externím souboru mapování. Výchozí mapování typů pro metodu CreateDatabase definují, který typ sloupců SQL Serveru se vytvoří pro mapování na typy CLR v objektovém modelu. Další informace naleznete v tématu Postupy: Dynamické vytvoření databáze.

Matice chování mapování typů za běhu

Následující diagram znázorňuje očekávané chování mapování konkrétního typu za běhu při načtení nebo uložení dat do databáze. S výjimkou serializace LINQ to SQL nepodporuje mapování mezi žádnými datovými typy CLR nebo SQL Server, které nejsou zadány v této matici. Další informace o podpoře serializace naleznete v tématu Binární serializace.

SQL Server to SQL CLR data type mapping table

Poznámka:

Některá mapování typů můžou způsobit přetečení nebo výjimky ztráty dat při překladu do databáze nebo z databáze.

Mapování vlastních typů

U LINQ to SQL nejste omezeni na výchozí mapování typů, které používá Návrhář relací objektů, SQLMetal a CreateDatabase metoda. Mapování vlastních typů můžete vytvořit tak, že je explicitně zadáte do souboru DBML. Pak můžete tento soubor DBML použít k vytvoření kódu objektového modelu a souboru mapování. Další informace najdete v tématu Mapování vlastních typů SQL-CLR.

Rozdíly v chování mezi clr a spouštěním SQL

Vzhledem k rozdílům v přesnosti a provádění mezi CLR a SQL Serverem můžete obdržet různé výsledky nebo zaznamenat různé chování v závislosti na tom, kde provádíte výpočty. Výpočty prováděné v dotazech LINQ to SQL se ve skutečnosti přeloží do jazyka Transact-SQL a pak se spustí v databázi SQL Serveru. Výpočty prováděné mimo dotazy LINQ to SQL se provádějí v kontextu CLR.

Tady jsou například některé rozdíly v chování modulu CLR a SQL Serveru:

  • SQL Server objednává některé datové typy jinak než data ekvivalentního typu v MODULU CLR. Například data SQL Serveru typu UNIQUEIDENTIFIER jsou seřazena odlišně než data CLR typu System.Guid.

  • SQL Server zpracovává některé operace porovnání řetězců odlišně než CLR. V SQL Serveru závisí chování porovnání řetězců na nastavení kolace na serveru. Další informace naleznete v tématu Práce s kolacemi.

  • SQL Server může vrátit jiné hodnoty pro některé mapované funkce než CLR. Například funkce rovnosti se budou lišit, protože SQL Server považuje dva řetězce za stejný, pokud se liší pouze na konci prázdného místa; vzhledem k tomu, že CLR je považuje za nerovnající se.

Mapování výčtu

LINQ to SQL podporuje mapování typu CLR System.Enum na typy SQL Serveru dvěma způsoby:

  • Mapování na číselné typy SQL (TINYINT, SMALLINT, INT, BIGINT)

    Při mapování typu CLR System.Enum na číselný typ SQL namapujete základní celočíselnou hodnotu CLR System.Enum na hodnotu sloupce databáze SQL Serveru. Pokud například pojmenovaný System.EnumDaysOfWeek obsahuje člen Tue s podkladovou celočíselnou hodnotou 3, tento člen se mapuje na hodnotu databáze 3.

  • Mapování na typy textu SQL (CHAR, NCHAR, VARCHAR, NVARCHAR)

    Při mapování typu CLR System.Enum na typ textu SQL se hodnota databáze SQL mapuje na názvy členů CLR System.Enum . Pokud například pojmenovaný System.EnumDaysOfWeek obsahuje člena Tue s podkladovou celočíselnou hodnotou 3, tento člen se mapuje na hodnotu Tuedatabáze .

Poznámka:

Při mapování textových typů SQL na CLR System.Enumzahrňte pouze názvy Enum členů v mapovaném sloupci SQL. Ostatní hodnoty nejsou ve sloupci EnumSQL mapované.

Nástroj příkazového řádku Návrhář relací a SQLMetal nemůžou automaticky mapovat typ SQL na třídu CLR Enum . Toto mapování musíte explicitně nakonfigurovat přizpůsobením souboru DBML pro použití návrhářem objektů A SQLMetal. Další informace o mapování vlastních typů naleznete v tématu Mapování vlastních typů SQL-CLR.

Protože sloupec SQL určený pro výčet bude stejného typu jako ostatní číselné a textové sloupce; tyto nástroje nerozpozná váš záměr a výchozí nastavení mapování, jak je popsáno v následujících částech mapování čísel a textu a mapování XML. Další informace o generování kódu pomocí souboru DBML naleznete v tématu Generování kódu v LINQ to SQL.

Metoda DataContext.CreateDatabase vytvoří sloupec SQL číselného typu pro mapování typu CLR System.Enum .

Číselné mapování

LINQ to SQL umožňuje namapovat mnoho číselných typů CLR a SQL Serveru. Následující tabulka ukazuje typy CLR, které návrhář relací a SQLMetal vyberou při sestavování objektového modelu nebo externího souboru mapování na základě vaší databáze.

Typ SQL Serveru Výchozí mapování typů CLR, které používá Návrhář relací objektů a 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

Následující tabulka ukazuje výchozí mapování typů, které DataContext.CreateDatabase metoda používá k definování typu sloupců SQL, které se mají mapovat na typy CLR definované v objektovém modelu nebo externím souboru mapování.

Typ CLR Výchozí typ SQL Serveru, který používá 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

Existuje mnoho dalších číselných mapování, které můžete zvolit, ale některé můžou způsobit přetečení nebo výjimky ztráty dat při překladu do nebo z databáze. Další informace naleznete v matici chování běhového běhu mapování typů.

Desetinné a peněžní typy

Výchozí přesnost typu SQL Serveru DECIMAL (18 desítkových číslic vlevo a vpravo od desetinné čárky) je mnohem menší než přesnost typu CLR System.Decimal , se kterou se ve výchozím nastavení spáruje. To může vést ke ztrátě přesnosti při ukládání dat do databáze. K opaku ale může dojít, pokud je typ SQL Serveru DECIMAL nakonfigurovaný s přesností větší než 29 číslic. Pokud je typ SQL Serveru DECIMAL nakonfigurovaný s větší přesností než CLR System.Decimal, může dojít ke ztrátě přesnosti při načítání dat z databáze.

SQL Server MONEY a SMALLMONEY typy, které jsou ve výchozím nastavení spárované s typem CLR System.Decimal , mají mnohem menší přesnost, což může vést k výjimkám přetečení nebo ztrátě dat při ukládání dat do databáze.

Mapování textu a XML

Existuje také mnoho textových typů a typů XML, které můžete mapovat pomocí LINQ to SQL. Následující tabulka ukazuje typy CLR, které návrhář relací a SQLMetal vyberou při sestavování objektového modelu nebo externího souboru mapování na základě vaší databáze.

Typ SQL Serveru Výchozí mapování typů CLR, které používá Návrhář relací objektů a SQLMetal
CHAR System.String
NCHAR System.String
VARCHAR System.String
NVARCHAR System.String
TEXT System.String
NTEXT System.String
XML System.Xml.Linq.XElement

Následující tabulka ukazuje výchozí mapování typů, které DataContext.CreateDatabase metoda používá k definování typu sloupců SQL, které se mají mapovat na typy CLR definované v objektovém modelu nebo externím souboru mapování.

Typ CLR Výchozí typ SQL Serveru, který používá DataContext.CreateDatabase
System.Char NCHAR(1)
System.String NVARCHAR(4000)
System.Char[] NVARCHAR(4000)
Implementace Parse() vlastního typu a ToString() NVARCHAR(MAX)

Existuje mnoho dalších mapování založených na textu a XML, které můžete zvolit, ale některé můžou vést k přetečení nebo ztrátě dat při překladu do nebo z databáze. Další informace naleznete v matici chování běhového běhu mapování typů.

Typy XML

Datový typ SQL Serveru XML je k dispozici od Microsoft SQL Serveru 2005. Datový typ SQL Serveru XML můžete mapovat na XElement, XDocumentnebo String. Pokud sloupec ukládá fragmenty XML, které nelze načíst XElement, musí být sloupec namapován, aby nedocházelo k String chybám za běhu. Fragmenty XML, které musí být namapovány tak, aby String zahrnovaly následující:

  • Posloupnost elementů XML

  • Atributy

  • Veřejné identifikátory (PI)

  • Komentáře

I když můžete mapovat XElement a XDocument na SQL Server, jak je znázorněno v matici chování spuštění mapování typů, DataContext.CreateDatabase metoda nemá žádné výchozí mapování typů SQL Serveru pro tyto typy.

Vlastní typy

Pokud třída implementuje Parse() a ToString(), můžete mapovat objekt na libovolný typ textu SQL (CHAR, NCHAR, VARCHAR, NVARCHAR, TEXT, NTEXT). XML Objekt je uložen v databázi odesláním hodnoty vrácené ToString() do mapovaného sloupce databáze. Objekt je rekonstruován vyvoláním Parse() řetězce vráceného databází.

Poznámka:

LINQ to SQL nepodporuje serializaci pomocí .System.Xml.Serialization.IXmlSerializable

Mapování data a času

Pomocí LINQ to SQL můžete mapovat mnoho typů data a času SQL Serveru. Následující tabulka ukazuje typy CLR, které návrhář relací a SQLMetal vyberou při sestavování objektového modelu nebo externího souboru mapování na základě vaší databáze.

Typ SQL Serveru Výchozí mapování typů CLR, které používá Návrhář relací objektů a SQLMetal
SMALLDATETIME System.DateTime
DATETIME System.DateTime
DATETIME2 System.DateTime
DATETIMEOFFSET System.DateTimeOffset
DATE System.DateTime
TIME System.TimeSpan

Následující tabulka ukazuje výchozí mapování typů, které DataContext.CreateDatabase metoda používá k definování typu sloupců SQL, které se mají mapovat na typy CLR definované v objektovém modelu nebo externím souboru mapování.

Typ CLR Výchozí typ SQL Serveru, který používá DataContext.CreateDatabase
System.DateTime DATETIME
System.DateTimeOffset DATETIMEOFFSET
System.TimeSpan TIME

Existuje mnoho dalších mapování data a času, které můžete zvolit, ale některé můžou způsobit přetečení nebo výjimky ztráty dat při překladu do nebo z databáze. Další informace naleznete v matici chování běhového běhu mapování typů.

Poznámka:

Typy SQL Serveru DATETIME2, DATETIMEOFFSETDATEa TIME jsou k dispozici od Microsoft SQL Server 2008. LINQ to SQL podporuje mapování na tyto nové typy počínaje rozhraním .NET Framework verze 3.5 SP1.

System.datetime

Rozsah a přesnost typu CLR System.DateTime je větší než rozsah a přesnost typu SQL Serveru DATETIME , což je výchozí mapování typů pro metodu DataContext.CreateDatabase . Chcete-li se vyhnout výjimkám souvisejícím s kalendářními daty mimo rozsah DATETIMEpoužití , DATETIME2který je k dispozici od Microsoft SQL Serveru 2008. DATETIME2 může odpovídat rozsahu a přesnosti CLR System.DateTime.

Data SQL Serveru nemají žádný koncept TimeZone, funkce, která je bohatě podporována v CLR. TimeZone hodnoty jsou uloženy jako v databázi bez TimeZone převodu bez ohledu na původní DateTimeKind informace. Když DateTime se hodnoty načtou z databáze, jejich hodnota se načte tak, jak je to s DateTimeDateTimeKind hodnotou Unspecified. Další informace o podporovaných System.DateTime metodách naleznete v tématu System.DateTime Methods.

System.TimeSpan

Microsoft SQL Server 2008 a .NET Framework 3.5 SP1 umožňují mapovat typ CLR System.TimeSpan na typ SQL Serveru TIME . Existuje však velký rozdíl mezi rozsahem, který CLR System.TimeSpan podporuje a jaký typ SQL Serveru TIME podporuje. Mapování hodnot menší než 0 nebo větší než 23:59:59,99999999 hodiny na SQL TIME způsobí přetečení výjimek. Další informace naleznete v tématu System.TimeSpan Metody.

V systému Microsoft SQL Server 2000 a SQL Server 2005 nelze mapovat pole databáze na TimeSpan. Operace TimeSpan jsou však podporovány, protože TimeSpan hodnoty mohou být vráceny od DateTime odčítání nebo zavedeny do výrazu jako literál nebo vázané proměnné.

Binární mapování

Existuje mnoho typů SQL Serveru, které lze mapovat na typ System.Data.Linq.BinaryCLR . Následující tabulka ukazuje typy SQL Serveru, které způsobují, že Návrhář relací objektů a SQLMetal definují typ CLR System.Data.Linq.Binary při vytváření objektového modelu nebo externího souboru mapování na základě vaší databáze.

Typ SQL Serveru Výchozí mapování typů CLR, které používá Návrhář relací objektů a SQLMetal
BINARY(50) System.Data.Linq.Binary
VARBINARY(50) System.Data.Linq.Binary
VARBINARY(MAX) System.Data.Linq.Binary
VARBINARY(MAX)s atributem FILESTREAM System.Data.Linq.Binary
IMAGE System.Data.Linq.Binary
TIMESTAMP System.Data.Linq.Binary

Následující tabulka ukazuje výchozí mapování typů, které DataContext.CreateDatabase metoda používá k definování typu sloupců SQL, které se mají mapovat na typy CLR definované v objektovém modelu nebo externím souboru mapování.

Typ CLR Výchozí typ SQL Serveru, který používá DataContext.CreateDatabase
System.Data.Linq.Binary VARBINARY(MAX)
System.Byte VARBINARY(MAX)
System.Runtime.Serialization.ISerializable VARBINARY(MAX)

Existuje mnoho dalších binárních mapování, které můžete zvolit, ale některé můžou způsobit přetečení nebo výjimky ztráty dat při překladu do nebo z databáze. Další informace naleznete v matici chování běhového běhu mapování typů.

SQL Server FILESTREAM

Atribut FILESTREAM pro VARBINARY(MAX) sloupce je k dispozici od Microsoft SQL Serveru 2008. Na něj můžete namapovat linQ to SQL počínaje rozhraním .NET Framework verze 3.5 SP1.

I když můžete mapovat VARBINARY(MAX) sloupce s atributem FILESTREAM na Binary objekty, DataContext.CreateDatabase metoda nemůže automaticky vytvářet sloupce s atributem FILESTREAM . Další informace naleznete v FILESTREAMtématu FILESTREAM Přehled.

Binární serializace

Pokud třída implementuje ISerializable rozhraní, můžete serializovat objekt do libovolného binárního pole SQL (BINARY, , VARBINARYIMAGE). Objekt je serializován a deserializován podle způsobu ISerializable implementace rozhraní. Další informace naleznete v tématu Binární serializace.

Různé mapování

Následující tabulka ukazuje výchozí mapování typů pro některé různé typy, které ještě nebyly zmíněny. Následující tabulka ukazuje typy CLR, které návrhář relací a SQLMetal vyberou při sestavování objektového modelu nebo externího souboru mapování na základě vaší databáze.

Typ SQL Serveru Výchozí mapování typů CLR, které používá Návrhář relací objektů a SQLMetal
UNIQUEIDENTIFIER System.Guid
SQL_VARIANT System.Object

Následující tabulka ukazuje výchozí mapování typů, které DataContext.CreateDatabase metoda používá k definování typu sloupců SQL, které se mají mapovat na typy CLR definované v objektovém modelu nebo externím souboru mapování.

Typ CLR Výchozí typ SQL Serveru, který používá DataContext.CreateDatabase
System.Guid UNIQUEIDENTIFIER
System.Object SQL_VARIANT

LINQ to SQL nepodporuje žádné další mapování typů pro tyto různé typy. Další informace naleznete v matici chování běhového běhu mapování typů.

Viz také