Generación de código en LINQ to SQL

Actualización: November 2007

Puede generar código para representar una base de datos utilizando el Diseñador relacional de objetos o la herramienta de línea de comandos SQLMetal. En cualquier caso, la generación de código de un extremo a otro se produce en tres etapas:

  1. El Extractor de DBML extrae información del esquema de la base de datos y vuelve a ensamblar la información en un archivo DBML con formato XML.

  2. El Validador de DBML examina el archivo DBML en busca de errores.

  3. Si no aparece ningún error de validación, el archivo se pasa al Generador de código.

Para obtener más información, vea Herramienta de generación de código (SqlMetal.exe). Los desarrolladores que utilizan Visual Studio también pueden utilizar Diseñador relacional de objetos para generar código.

Extractor de DBML

El Extractor de DBML es un componente de LINQ to SQL que acepta metadatos de una base de datos como entrada y genera un archivo DBML como resultado. La siguiente ilustración muestra la secuencia de operaciones.

Generador de código

El Generador de código es un componente de LINQ to SQL que traduce archivos DBML a Visual Basic, C# o archivos de asignación XML. La siguiente ilustración muestra la secuencia de operaciones.

Archivo de definición de esquema XML

El archivo DBML debe ser válido, según la siguiente definición de esquema, como archivo XSD.

Distinga este archivo de definición de esquema del archivo de definición de esquema que se utiliza para validar un archivo de asignación externa. Para obtener más información, vea Referencia de asignación externa (LINQ to SQL).

Nota:

Los usuarios de Visual Studio también encontrarán este archivo XSD en el cuadro de diálogo de Esquemas XML como "DbmlSchema.xsd". Para utilizar correctamente el archivo XSD para validar un archivo DBML, vea Cómo: Validar archivos de asignación externa y 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>

Archivo DBML de ejemplo

El código siguiente es un fragmento del archivo DBML creado a partir de la base de datos de ejemplo Northwind. Puede generar el archivo entero utilizando SQLMetal con la opción /xml. Para obtener más información, vea Herramienta de generación de código (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>

Vea también

Tareas

Cómo: Generar el modelo de objetos como un archivo externo (LINQ to SQL)

Conceptos

Descargar bases de datos de ejemplo (LINQ to SQL)

Referencia

Referencia de asignación externa (LINQ to SQL)

Otros recursos

Información general (LINQ to SQL)

Referencia (LINQ to SQL)