Delen via


Codegeneratie in LINQ naar SQL

U kunt code genereren om een database weer te geven met behulp van de relationele ontwerpfunctie voor objecten of het opdrachtregelprogramma SQLMetal. In beide gevallen vindt end-to-end-codegeneratie plaats in drie fasen:

  1. De DBML Extractor extraheert schemagegevens uit de database en herassembleert de informatie in een DBML-bestand met XML-indeling.
  2. Het DBML-bestand wordt gescand door de DBML Validator op fouten.
  3. Als er geen validatiefouten worden weergegeven, wordt het bestand doorgegeven aan de codegenerator.

Zie SqlMetal.exe (hulpprogramma voor het genereren van code) voor meer informatie. Ontwikkelaars die Visual Studio gebruiken, kunnen ook Object Relational Designer gebruiken om code te genereren. Zie LINQ naar SQL Tools in Visual Studio.

DBML Extractor

De DBML Extractor is een LINQ naar SQL-onderdeel dat databasemetagegevens als invoer gebruikt en een DBML-bestand als uitvoer produceert.

Codegenerator

De codegenerator is een LINQ naar een SQL-onderdeel waarmee DBML-bestanden worden omgezet in Visual Basic-, C#- of XML-toewijzingsbestanden.

XML-schemadefinitiebestand

Het DBML-bestand moet geldig zijn op basis van de volgende schemadefinitie als een XSD-bestand.

Onderscheid maken tussen dit schemadefinitiebestand en het schemadefinitiebestand dat wordt gebruikt om een extern toewijzingsbestand te valideren. Zie Externe toewijzing voor meer informatie.

Notitie

Visual Studio-gebruikers vinden dit XSD-bestand ook in het dialoogvenster XML-schema's als DbmlSchema.xsd. Als u het XSD-bestand correct wilt gebruiken voor het valideren van een DBML-bestand, raadpleegt u Het volgende: DBML- en externe toewijzingsbestanden valideren.

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.microsoft.com/linqtosql/dbml/2007" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007"
elementFormDefault="qualified" >
  <xs:element name="Database" type="Database" />
  <xs:complexType name="Database">
    <xs:sequence>
      <xs:element name="Connection" type="Connection" minOccurs="0" maxOccurs="1" />
      <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="EntityNamespace" type="xs:string" use="optional" />
    <xs:attribute name="ContextNamespace" type="xs:string" use="optional" />
    <xs:attribute name="Class" type="xs:string" use="optional" />
    <xs:attribute name="AccessModifier" type="AccessModifier" use="optional" />
    <xs:attribute name="Modifier" type="ClassModifier" use="optional" />
    <xs:attribute name="BaseType" type="xs:string" use="optional" />
    <xs:attribute name="Provider" type="xs:string" use="optional" />
    <xs:attribute name="ExternalMapping" type="xs:boolean" use="optional" />
    <xs:attribute name="Serialization" type="SerializationMode" use="optional" />
    <xs:attribute name="EntityBase" type="xs:string" use="optional" />
  </xs:complexType>
  <xs:complexType name="Table">
    <xs:all>
      <xs:element name="Type" type="Type" minOccurs="1" maxOccurs="1" />
      <xs:element name="InsertFunction" type="TableFunction" minOccurs="0" maxOccurs="1" />
      <xs:element name="UpdateFunction" type="TableFunction" minOccurs="0" maxOccurs="1" />
      <xs:element name="DeleteFunction" type="TableFunction" minOccurs="0" maxOccurs="1" />
    </xs:all>
    <xs:attribute name="Name" type="xs:string" use="required" />
    <xs:attribute name="Member" type="xs:string" use="optional" />
    <xs:attribute name="AccessModifier" type="AccessModifier" use="optional" />
    <xs:attribute name="Modifier" type="MemberModifier" 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="IdRef" type="xs:IDREF" use="optional" />
    <xs:attribute name="Id" type="xs:ID" use="optional" />
    <xs:attribute name="Name" type="xs:string" use="optional" />
    <xs:attribute name="InheritanceCode" type="xs:string" use="optional" />
    <xs:attribute name="IsInheritanceDefault" type="xs:boolean" use="optional" />
    <xs:attribute name="AccessModifier" type="AccessModifier" use="optional" />
    <xs:attribute name="Modifier" type="ClassModifier" 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="optional" />
    <xs:attribute name="Storage" type="xs:string" use="optional" />
    <xs:attribute name="AccessModifier" type="AccessModifier" use="optional" />
    <xs:attribute name="Modifier" type="MemberModifier" use="optional" />
    <xs:attribute name="Type" type="xs:string" use="required" />
    <xs:attribute name="DbType" type="xs:string" use="optional" />
    <xs:attribute name="IsReadOnly" type="xs:boolean" 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="IsDelayLoaded" 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="required" />
    <xs:attribute name="Member" type="xs:string" use="required" />
    <xs:attribute name="Storage" type="xs:string" use="optional" />
    <xs:attribute name="AccessModifier" type="AccessModifier" use="optional" />
    <xs:attribute name="Modifier" type="MemberModifier" use="optional" />
    <xs:attribute name="Type" type="xs:string" use="required" />
    <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="Cardinality" type="Cardinality" 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="required" />
    <xs:attribute name="Id" type="xs:ID" use="optional" />
    <xs:attribute name="Method" type="xs:string" use="optional" />
    <xs:attribute name="AccessModifier" type="AccessModifier" use="optional" />
    <xs:attribute name="Modifier" type="MemberModifier" use="optional" />
    <xs:attribute name="HasMultipleResults" type="xs:boolean" use="optional" />
    <xs:attribute name="IsComposable" type="xs:boolean" use="optional" />
  </xs:complexType>
  <xs:complexType name="TableFunction">
    <xs:sequence>
      <xs:element name="Argument" type="TableFunctionParameter" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="Return" type="TableFunctionReturn" minOccurs="0" maxOccurs="1" />
    </xs:sequence>
    <xs:attribute name="FunctionId" type="xs:IDREF" use="required" />
    <xs:attribute name="AccessModifier" type="AccessModifier" use="optional" />
  </xs:complexType>
  <xs:complexType name="Parameter">
    <xs:attribute name="Name" type="xs:string" use="required" />
    <xs:attribute name="Parameter" type="xs:string" use="optional" />
    <xs:attribute name="Type" 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="Type" type="xs:string" use="required" />
    <xs:attribute name="DbType" type="xs:string" use="optional" />
  </xs:complexType>
  <xs:complexType name="TableFunctionParameter">
    <xs:attribute name="Parameter" type="xs:string" use="required" />
    <xs:attribute name="Member" type="xs:string" use="required" />
    <xs:attribute name="Version" type="Version" use="optional" />
  </xs:complexType>
  <xs:complexType name="TableFunctionReturn">
    <xs:attribute name="Member" type="xs:string" use="required" />
  </xs:complexType>
  <xs:complexType name="Connection">
    <xs:attribute name="Provider" type="xs:string" use="required" />
    <xs:attribute name="Mode" type="ConnectionMode" use="optional" />
    <xs:attribute name="ConnectionString" type="xs:string" use="optional" />
    <xs:attribute name="SettingsObjectName" type="xs:string" use="optional" />
    <xs:attribute name="SettingsPropertyName" type="xs:string" use="optional" />
  </xs:complexType>
  <xs:simpleType name="ConnectionMode">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ConnectionString" />
      <xs:enumeration value="AppSettings" />
      <xs:enumeration value="WebSettings" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="AccessModifier">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Public" />
      <xs:enumeration value="Internal" />
      <xs:enumeration value="Protected" />
      <xs:enumeration value="ProtectedInternal" />
      <xs:enumeration value="Private" />
    </xs:restriction>
  </xs:simpleType>
  <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="SerializationMode">
    <xs:restriction base="xs:string">
      <xs:enumeration value="None" />
      <xs:enumeration value="Unidirectional" />
    </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="Version">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Current" />
      <xs:enumeration value="Original" />
    </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:simpleType name="ClassModifier">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Sealed" />
      <xs:enumeration value="Abstract" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MemberModifier">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Virtual" />
      <xs:enumeration value="Override" />
      <xs:enumeration value="New" />
      <xs:enumeration value="NewVirtual" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="Cardinality">
    <xs:restriction base="xs:string">
      <xs:enumeration value="One" />
      <xs:enumeration value="Many" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

Voorbeeld van DBML-bestand

De volgende code is een fragment van het DBML-bestand dat is gemaakt op basis van de Northwind-voorbeelddatabase. U kunt het hele bestand genereren met behulp van SQLMetal met de optie /xml . Zie SqlMetal.exe (hulpprogramma voor het genereren van code) voor meer informatie.

<?xml version="1.0" encoding="utf-16"?>
<Database Name="northwnd" Class="Northwnd" xmlns="http://schemas.microsoft.com/dsltools/DLinqML">

  <Table Name="Customers">
    <Type Name="Customer">
      <Column Name="CustomerID" Type="System.String" DbType="NChar(5) NOT NULL" IsPrimaryKey="True" CanBeNull="False" />
      <Column Name="CompanyName" Type="System.String" DbType="NVarChar(40) NOT NULL" CanBeNull="False" />
      <Column Name="ContactName" Type="System.String" DbType="NVarChar(30)" CanBeNull="True" />
      <Column Name="ContactTitle" Type="System.String" DbType="NVarChar(30)" CanBeNull="True" />
      <Column Name="Address" Type="System.String" DbType="NVarChar(60)" CanBeNull="True" />
      <Column Name="City" Type="System.String" DbType="NVarChar(15)" CanBeNull="True" />
      <Column Name="Region" Type="System.String" DbType="NVarChar(15)" CanBeNull="True" />
      <Column Name="PostalCode" Type="System.String" DbType="NVarChar(10)" CanBeNull="True" />
      <Column Name="Country" Type="System.String" DbType="NVarChar(15)" CanBeNull="True" />
      <Column Name="Phone" Type="System.String" DbType="NVarChar(24)" CanBeNull="True" />
      <Column Name="Fax" Type="System.String" DbType="NVarChar(24)" CanBeNull="True" />
      <Association Name="FK_CustomerCustomerDemo_Customers" Member="CustomerCustomerDemos" ThisKey="CustomerID" OtherKey="CustomerID" OtherTable="CustomerCustomerDemo" DeleteRule="NO ACTION" />
      <Association Name="FK_Orders_Customers" Member="Orders" ThisKey="CustomerID" OtherKey="CustomerID" OtherTable="Orders" DeleteRule="NO ACTION" />
    </Type>
  </Table>
</Database>

Zie ook