Создание кода в LINQ to SQL

Создание кода, представляющего базу данных, можно выполнить с помощью конструктора Реляционный конструктор объектов или программы командной строки SQLMetal. В любом случае полный процесс создания кода включает три этапа.

  1. Средство извлечения DBML извлекает из базы данных сведения о схеме и перекомпилирует эти сведения в XML-файл DBML.

  2. Файл DBML сканируется средством проверки DBML на наличие ошибок.

  3. Если ошибки не обнаружены, файл передается в генератор кода.

Дополнительные сведения см. в разделе SqlMetal.exe (средство создания кода). Пользователи среды Visual Studio могут сформировать этот код с помощью Реляционный конструктор объектов. Дополнительные сведения см. в следующем разделе. Реляционный конструктор объектов и Реляционный конструктор объектов и Реляционный конструктор объектов.

Средство извлечения DBML

Средство извлечения DBML является компонентом LINQ to SQL, который в качестве входа использует метаданные, а в качестве выхода — формирует файл DBML. На следующем рисунке показана последовательность операций.

Средство извлечения DBML

Генератор кода

Генератор кода — это компонент LINQ to SQL, который преобразует файл DBML в файлы Visual Basic, C# или XML-файлы сопоставлений. На следующем рисунке показана последовательность операций.

Генератор кода

Файл определения схемы XML

Файл DBML должен быть проверен на соответствие следующему XSD-файлу определению схемы.

Следует отличать этот файл определения схемы от файла определения схемы, который используется для проверки файла внешних сопоставлений. Дополнительные сведения см. в разделе Справочные сведения о внешнем сопоставлении (LINQ to SQL).

ПримечаниеПримечание

Пользователи Visual Studio могут также найти этот XSD-файл в диалоговом окне схем XML. Файл называется "DbmlSchema.xsd".Чтобы правильно использовать XSD-файл для проверки DBML-файла, ознакомьтесь со сведениями раздела Как проверить DBML-файлы и внешние файлы сопоставлений (LINQ to SQL).

?<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://schemas.microsoft.com/linqtosql/dbml/2007" xmlns="https://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>

Образец DBML-файла

Следующий код является фрагментом DBML-файла, созданного из образца базы данных Northwind. Полностью файл можно сформировать средством SQLMetal с параметром /xml. Дополнительные сведения см. в разделе SqlMetal.exe (средство создания кода).

<?xml version="1.0" encoding="utf-16"?>
<Database Name="northwnd" Class="Northwnd" xmlns="https://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>

См. также

Задачи

Как сформировать модель объектов в виде внешнего файла (LINQ to SQL)

Ссылки

Справочные сведения о внешнем сопоставлении (LINQ to SQL)

Основные понятия

Загрузка образцов баз данных (LINQ to SQL)

Другие ресурсы

Дополнительные сведения (LINQ to SQL)

Справочник (LINQ to SQL)