Mapowanie zewnętrzne
LINQ to SQL obsługuje mapowanie zewnętrzne, czyli proces, za pomocą którego używasz oddzielnego pliku XML do określania mapowania między modelem danych bazy danych a modelem obiektów. Zalety korzystania z pliku mapowania zewnętrznego obejmują następujące elementy:
Kod mapowania można zachować poza kodem aplikacji. Takie podejście zmniejsza bałagan w kodzie aplikacji.
Plik mapowania zewnętrznego można traktować jak plik konfiguracji. Na przykład możesz zaktualizować działanie aplikacji po wysłaniu plików binarnych, zamieniając plik mapowania zewnętrznego.
Wymagania
Plik mapowania musi być plikiem XML, a plik musi zostać zweryfikowany względem pliku definicji schematu LINQ to SQL (xsd).
Obowiązują następujące zasady:
Plik mapowania musi być plikiem XML.
Plik mapowania XML musi być prawidłowy względem pliku definicji schematu XML. Aby uzyskać więcej informacji, zobacz How to: Validate DBML and External Mapping Files (Instrukcje: weryfikowanie plików DBML i plików mapowania zewnętrznego).
Mapowanie zewnętrzne zastępuje mapowanie oparte na atrybutach. Innymi słowy, gdy używasz zewnętrznego źródła mapowania do utworzenia DataContextelementu , DataContext ignoruje wszystkie atrybuty mapowania utworzone w klasach. To zachowanie jest prawdziwe, czy klasa jest uwzględniona w pliku mapowania zewnętrznego.
LINQ to SQL nie obsługuje hybrydowego użycia dwóch metod mapowania (opartych na atrybutach i zewnętrznych).
Plik definicji schematu XML
Mapowanie zewnętrzne w linQ to SQL musi być prawidłowe względem poniższej definicji schematu XML.
Odróżnić ten plik definicji schematu od pliku definicji schematu używanego do sprawdzania poprawności pliku DBML. Aby uzyskać więcej informacji, zobacz Generowanie kodu w linQ to SQL).
Uwaga
Użytkownicy programu Visual Studio znajdą również ten plik XSD w oknie dialogowym Schematy XML jako "LinqToSqlMapping.xsd". Aby poprawnie użyć tego pliku do sprawdzania poprawności pliku mapowania zewnętrznego, zobacz How to: Validate DBML and External Mapping Files (Instrukcje: weryfikowanie kodu DBML i plików mapowania zewnętrznego).
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.microsoft.com/linqtosql/mapping/2007" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"
elementFormDefault="qualified" >
<xs:element name="Database" type="Database" />
<xs:complexType name="Database">
<xs:sequence>
<xs:element name="Table" type="Table" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="Function" type="Function" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use="optional" />
<xs:attribute name="Provider" type="xs:string" use="optional" />
</xs:complexType>
<xs:complexType name="Table">
<xs:sequence>
<xs:element name="Type" type="Type" minOccurs="1" maxOccurs="1" />
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use="optional" />
<xs:attribute name="Member" type="xs:string" use="optional" />
</xs:complexType>
<xs:complexType name="Type">
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Column" type="Column" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="Association" type="Association" minOccurs="0" maxOccurs="unbounded" />
</xs:choice>
<xs:element name="Type" type="Type" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use="required" />
<xs:attribute name="InheritanceCode" type="xs:string" use="optional" />
<xs:attribute name="IsInheritanceDefault" type="xs:boolean" use="optional" />
</xs:complexType>
<xs:complexType name="Column">
<xs:attribute name="Name" type="xs:string" use="optional" />
<xs:attribute name="Member" type="xs:string" use="required" />
<xs:attribute name="Storage" type="xs:string" use="optional" />
<xs:attribute name="DbType" type="xs:string" use="optional" />
<xs:attribute name="IsPrimaryKey" type="xs:boolean" use="optional" />
<xs:attribute name="IsDbGenerated" type="xs:boolean" use="optional" />
<xs:attribute name="CanBeNull" type="xs:boolean" use="optional" />
<xs:attribute name="UpdateCheck" type="UpdateCheck" use="optional" />
<xs:attribute name="IsDiscriminator" type="xs:boolean" use="optional" />
<xs:attribute name="Expression" type="xs:string" use="optional" />
<xs:attribute name="IsVersion" type="xs:boolean" use="optional" />
<xs:attribute name="AutoSync" type="AutoSync" use="optional" />
</xs:complexType>
<xs:complexType name="Association">
<xs:attribute name="Name" type="xs:string" use="optional" />
<xs:attribute name="Member" type="xs:string" use="required" />
<xs:attribute name="Storage" type="xs:string" use="optional" />
<xs:attribute name="ThisKey" type="xs:string" use="optional" />
<xs:attribute name="OtherKey" type="xs:string" use="optional" />
<xs:attribute name="IsForeignKey" type="xs:boolean" use="optional" />
<xs:attribute name="IsUnique" type="xs:boolean" use="optional" />
<xs:attribute name="DeleteRule" type="xs:string" use="optional" />
<xs:attribute name="DeleteOnNull" type="xs:boolean" use="optional" />
</xs:complexType>
<xs:complexType name="Function">
<xs:sequence>
<xs:element name="Parameter" type="Parameter" minOccurs="0" maxOccurs="unbounded" />
<xs:choice>
<xs:element name="ElementType" type="Type" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="Return" type="Return" minOccurs="0" maxOccurs="1" />
</xs:choice>
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use="optional" />
<xs:attribute name="Method" type="xs:string" use="required" />
<xs:attribute name="IsComposable" type="xs:boolean" use="optional" />
</xs:complexType>
<xs:complexType name="Parameter">
<xs:attribute name="Name" type="xs:string" use="optional" />
<xs:attribute name="Parameter" type="xs:string" use="required" />
<xs:attribute name="DbType" type="xs:string" use="optional" />
<xs:attribute name="Direction" type="ParameterDirection" use="optional" />
</xs:complexType>
<xs:complexType name="Return">
<xs:attribute name="DbType" type="xs:string" use="optional" />
</xs:complexType>
<xs:simpleType name="UpdateCheck">
<xs:restriction base="xs:string">
<xs:enumeration value="Always" />
<xs:enumeration value="Never" />
<xs:enumeration value="WhenChanged" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ParameterDirection">
<xs:restriction base="xs:string">
<xs:enumeration value="In" />
<xs:enumeration value="Out" />
<xs:enumeration value="InOut" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="AutoSync">
<xs:restriction base="xs:string">
<xs:enumeration value="Never" />
<xs:enumeration value="OnInsert" />
<xs:enumeration value="OnUpdate" />
<xs:enumeration value="Always" />
<xs:enumeration value="Default" />
</xs:restriction>
</xs:simpleType>
</xs:schema>