Geração de código em LINQ to SQL
Você pode gerar código para representar um banco de dados usando o Object Relational Designer ou a ferramenta de linha de comando SQLMetal. Em ambos os casos, a geração de código de ponta a ponta ocorre em três estágios:
- O DBML Extrator extrai informações de esquema do banco de dados e remonta as informações em um arquivo DBML formatado em XML.
- O arquivo DBML é verificado pelo validador DBML em busca de erros.
- Se não aparecerem erros de validação, o ficheiro é passado para o Gerador de Códigos.
Para obter mais informações, consulte SqlMetal.exe (Ferramenta de geração de código). Os desenvolvedores que usam o Visual Studio também podem usar o Object Relational Designer para gerar código. Consulte LINQ to SQL Tools no Visual Studio.
DBML Extractor
O DBML Extrator é um componente LINQ to SQL que usa metadados de banco de dados como entrada e produz um arquivo DBML como saída.
Gerador de código
O Gerador de Códigos é um componente LINQ to SQL que traduz arquivos DBML para arquivos de mapeamento Visual Basic, C# ou XML.
Arquivo de definição de esquema XML
O arquivo DBML deve ser válido em relação à seguinte definição de esquema como um arquivo XSD.
Distinga esse arquivo de definição de esquema do arquivo de definição de esquema usado para validar um arquivo de mapeamento externo. Para obter mais informações, consulte Mapeamento externo).
Nota
Os usuários do Visual Studio também encontrarão esse arquivo XSD na caixa de diálogo Esquemas XML como "DbmlSchema.xsd". Para usar o arquivo XSD corretamente para validar um arquivo DBML, consulte Como validar arquivos DBML e de mapeamento externo.
<?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>
Exemplo de arquivo DBML
O código a seguir é um trecho do arquivo DBML criado a partir do banco de dados de exemplo Northwind. Você pode gerar o arquivo inteiro usando SQLMetal com a opção /xml . Para obter mais informações, consulte SqlMetal.exe (Ferramenta de geração de código).
<?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>