Codegenerierung in LINQ to SQL
Sie können Code zur Darstellung einer Datenbank generieren, indem Sie entweder den Objektrelationalen Designer oder das SQLMetal-Befehlszeilentool verwenden. Die End-to-End-Codegenerierung findet grundsätzlich in drei Phasen statt:
- Das DBML-Extrahierungsprogramm extrahiert Schemainformationen aus der Datenbank und setzt die Informationen in einer XML-formatierten DBML-Datei wieder zusammen.
- Die DBML-Datei wird vom DBML-Validierungsprogramm auf Fehler überprüft.
- Wenn keine Validierungsfehler auftreten, wird die Datei an den Code-Generator übergeben.
Weitere Informationen finden Sie unter SqlMetal.exe (Tool zur Codegenerierung). Entwickler, die Visual Studio verwenden, können auch den objektrelationalen Designer verwenden, um Code zu generieren. Weitere Informationen finden Sie unter LINQ to SQL-Tools in Visual Studio.
DBML-Extrahierungsprogramm
Das DBML-Extrahierungsprogramm ist eine LINQ to SQL-Komponente, die Datenbank-Metadaten als Eingabe akzeptiert und eine DBML-Datei als Ausgabe erstellt.
Code-Generator
Der Codegenerator ist eine LINQ to SQL-Komponente, die DBML-Dateien in Visual Basic-, C#- oder XML-Zuordnungsdateien übersetzt.
XML-Schemadefinitionsdatei
Die DBML-Datei muss gegenüber der folgenden Schemadefinition als XSD-Datei gültig sein.
Beachten Sie den Unterschied zwischen dieser Schemadefinitionsdatei und der Schemadefinitionsdatei, die zum Überprüfen einer externen Zuordnungsdatei verwendet wird. Weitere Informationen finden Sie unter Externe Zuordnung.
Hinweis
Visual Studio-Benutzer finden diese XSD-Datei auch im Dialogfeld XML-Schemas als Datei "DbmlSchema.xsd". Weitere Informationen zum korrekten Verwenden der XSD-Datei zum Überprüfen einer DBML-Datei finden Sie unter Vorgehensweise: Validieren von DBML- und externen Dateien.
<?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>
Beispiel einer DBML-Datei
Der folgende Code entspricht einem Auszug aus der DBML-Datei, die aus der Beispieldatenbank Northwind erzeugt wurde. Sie können die gesamte Datei generieren, indem Sie SQLMetal mit der Option /xml verwenden. Weitere Informationen finden Sie unter SqlMetal.exe (Tool zur Codegenerierung).
<?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>