Как настроить файлы моделирования и сопоставления для работы с пользовательскими объектами (платформа Entity Framework)
Для использования пользовательских классов данных с моделью Entity Framework необходимо сопоставить типы и свойства сущностей, которые определены в концептуальной модели, с пользовательскими классами данных. При использовании средств модель EDM (сущностная модель данных) для создания содержимого модели и сопоставления из базы данных типы сущностей и наборы сущностей в концептуальной модели сопоставляются с таблицами базы данных. Чтобы обновить содержимое модели и сопоставления в соответствии с пользовательскими классами данных, необходимо выполнить следующие действия.
Обновите содержимое концептуальной модели, которое определено на языке CSDL, в соответствии с пользовательскими классами данных.
В случае необходимости обновите содержимое режима хранения, которое определено на языке SSDL.
Обновите содержимое сопоставления, которое определено на языке MSL.
Проверьте обновленное содержимое модели и сопоставления.
Не дайте Visual Studio создать уровень объектов.
Примечание |
---|
Средства модель EDM (сущностная модель данных) также могут формировать скрипты для создания новой базы данных на основе содержимого SSDL.В этом случае можно создать модель данных, соответствующую пользовательским классам данных, а затем создать новую базу данных на основе EDMX-файла.Дополнительные сведения см. в разделе How to: Create a Database from a Conceptual Model. |
В этом подразделе показано, как обновить модель с использованием программы ADO.NET Entity Data Model Designer (конструктор сущностей) или Генератор модели EDM (EdmGen.exe). Для запуска примеров из этого подраздела необходимо иметь уже созданную модель. Модель в этом примере основана на таблицах Contact, SalesOrderHeader и SalesOrderDetail базы данных AdventureWorks. Дополнительные сведения о создании новой модели см. в разделе Как использовать мастер моделей EDM (платформа Entity Framework) или Как использовать средство EdmGen.exe для создания файлов модели и сопоставления. Необходимо также добавить пользовательские классы данных Contact, Orders и LineItem, которые сопоставляются с таблицами Contact, SalesOrderHeader и SalesOrderDetail в проекте. Сведения о том, как определить пользовательские классы данных Contact, Orders и LineItem, см. в разделе Как определить сущности POCO (платформа Entity Framework).
Следующие процедуры предполагают наличие EDMX-файла, открытого в конструкторе сущностей.
Внесите изменения в модель с использованием конструктора моделей EDM.
Переименуйте элементы EntityType и EntitySet, чтобы их имена соответствовали именам пользовательских классов данных.
Выберите сущность Contact. В окне Свойства задайте значение Имя набора сущностей, равное ContactSet.
Выберите сущность SalesOrderHeader. В окне Свойства задайте значение Имя, равное Order, и значение Имя набора сущностей, равное OrderSet.
Выберите SalesOrderDetails. В окне Свойства и задайте значение Имя, равное LineItem, и значение Entity Set Name, равное LineItemSet.
Измените имя свойств навигации.
Выберите свойство навигации SalesOrderHeaders сущности Contact. В окне Свойства задайте значение Имя, равное Orders.
Выберите свойство навигации SalesOrderDetails сущности SalesOrderHeader. В окне Свойства задайте значение Имя, равное LineItems.
Выберите свойство навигации SalesOrderHeader сущности SalesOrderDetail. В окне Свойства задайте значение Имя, равное Order.
Измените ассоциацию.
Выберите ассоциацию между типами сущности «Client» и «Order» и измените следующие свойства в соответствии со следующими значениями в окне Свойства:
Имя набора ассоциаций: Order_ Contact_ ContactIDSet
Свойство навигации End1: Orders
Имя роли End1: Contact
Свойство навигации End2: Contact
Имя роли End2: Order
Имя: Order_Contact_ContactID
Выберите ассоциацию между типами сущности «Order» и «LineItem» и измените следующие свойства в соответствии со следующими значениями в окне Свойства:
Имя набора ассоциаций: LineItem_Order_SalesOrderIDSet
Свойство навигации End1: LineItems
Имя роли End1: Order
Свойство навигации End2: Order
Имя роли End2: LineItem
Имя: LineItem_Order_SalesOrderID
Создайте сложный тип на основе свойств типа сущности «Order».
Выберите следующие свойства сущности Order: AccountNumber, Comment, PurchaseOrderNumber и SalesOrderNumber, затем щелкните правой кнопкой и выберите Создать сложный тип.
Новый сложный тип с выбранными свойствами будет добавлен в Обозреватель моделей. Новое свойство сложного типа добавляется к сущности SalesOrderHeader. Сложному типу и свойству сложного типа присваиваются имена по умолчанию.
Переименуйте сложный тип в OrderInfo.
Переименуйте свойство сложного типа в ExtendedInfo.
Сохраните изменения в EDMX-файле.
Отключите создание кода для EDMX-файла. Откройте EDMX-файл в конструкторе сущностей (ADO.NET Entity Data Model Designer). Щелкните правой кнопкой мыши в области конструктора и выберите пункт «Свойства». В окне Свойства выберите свойство Стратегия создания кода и укажите значение None. Если окно Свойства не отображается, нажмите клавишу F4.
Внесите изменения в модель при помощи программы EdmGen.exe.
Откройте CSDL-файл в Visual Studio или в текстовом редакторе.
Переименуйте элементы EntityType и EntitySet, чтобы их имена соответствовали именам пользовательских классов данных.
Переименуйте элементы Property всех типов, чтобы их имена соответствовали именам свойств в пользовательских классах данных.
Удалите элементы Property всех свойств, не существующих в пользовательских классах данных.
Переименуйте элемент NavigationProperty в соответствии с именем свойства навигации в пользовательском классе данных. Убедитесь, что объекты FromRole и ToRole указывают на правильные типы сущностей.
Сохраните изменения в CSDL-файле.
Откройте MSL-файл в Visual Studio или в текстовом редакторе.
Переименуйте элемент EntitySetMapping и атрибут TypeName, чтобы их имена соответствовали именам пользовательских классов.
Удалите элементы EntitySetMapping для всех сущностей, не имеющих соответствий в пользовательских классах данных.
Переименуйте элементы ScalarProperty всех типов, чтобы их имена соответствовали именам свойств в пользовательских классах данных.
Удалите элемент ScalarProperty для всех свойств, не существующих в пользовательских классах данных.
Сохраните изменения в MSL-файле.
Откройте SSDL-файл в Visual Studio или в текстовом редакторе.
Удалите элементы EntityType для всех сущностей, не сопоставленных пользовательским классам данных.
Удалите элементы ScalarProperty для всех сущностей, не сопоставленных свойствам в пользовательских классах данных.
Сохраните изменения в SSDL-файле.
Проверьте обновленные файлы сопоставления, запустив программу EdmGen.exe в каталоге, содержащем файлы сопоставления.
Используйте следующую команду:
%windir%\Microsoft.NET\Framework\v4\edmgen.exe /mode:ValidateArtifacts /inssdl:. \YourModel.ssdl /inmsl:. \YourModel.msl /incsdl:. \YourModel.csdl
Примечание Удалите все разрывы строки и замените YourModel именем, используемым в файлах сопоставления. - Просмотрите выходные данные и устраните ошибки проверки.
Повторно сформируйте, сохраните и удалите автоматически созданный объектный код.
В Обозревателе решений среды Visual Studio щелкните правой кнопкой мыши CSDL-файл ** и выберите команду Пользовательское средство.
Будет повторно создан уровень объектов на основе измененного CSDL-файла.
Разверните узел CSDL-файла, откройте его в конструкторе и сохраните под другим именем.
Сохранится файл автоматически сформированного уровня объектов. Код этого файла используется в разделе Как определить контекст пользовательского объекта (платформа Entity Framework).
Исключите из проекта файл конструктора.
Выберите CSDL-файл и снимите флажок Пользовательское средство в окне Свойства.
В результате запрещается повторное создание файла уровня объектов. Чтобы создать этот файл в будущем, введите EntityModelCodeGenerator в качестве значения Пользовательское средство в окне Свойства и повторите шаг 1.
Пример
Следующий CSDL-файл был настроен для поддержки пользовательских классов данных Contact, Orders и LineItem.
<Schema Namespace="AdventureWorksModel" Alias="Self" xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="https://schemas.microsoft.com/ado/2008/09/edm">
<EntityContainer Name="AdventureWorksEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="LineItemSet" EntityType="AdventureWorksModel.LineItem" />
<EntitySet Name="OrderSet" EntityType="AdventureWorksModel.Order" />
<AssociationSet Name="LineItem_Order_SalesOrderIDSet" Association="AdventureWorksModel.LineItem_Order_SalesOrderID">
<End Role="Order" EntitySet="OrderSet" />
<End Role="LineItem" EntitySet="LineItemSet" />
</AssociationSet>
<EntitySet Name="ContactSet" EntityType="AdventureWorksModel.Contact" />
<AssociationSet Name="Order_Contact_ContactID" Association="AdventureWorksModel.Order_Contact_ContactID">
<End Role="Contact" EntitySet="ContactSet" />
<End Role="Order" EntitySet="OrderSet" /></AssociationSet>
</EntityContainer>
<EntityType Name="LineItem">
<Key>
<PropertyRef Name="SalesOrderID" />
<PropertyRef Name="SalesOrderDetailID" />
</Key>
<Property Name="SalesOrderID" Type="Int32" Nullable="false" />
<Property Name="SalesOrderDetailID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="CarrierTrackingNumber" Type="String" MaxLength="25" Unicode="true" FixedLength="false" />
<Property Name="OrderQty" Type="Int16" Nullable="false" />
<Property Name="ProductID" Type="Int32" Nullable="false" />
<Property Name="SpecialOfferID" Type="Int32" Nullable="false" />
<Property Name="UnitPrice" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="UnitPriceDiscount" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="LineTotal" Type="Decimal" Nullable="false" Precision="38" Scale="6" annotation:StoreGeneratedPattern="Computed" />
<Property Name="rowguid" Type="Guid" Nullable="false" />
<Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
<NavigationProperty Name="Order" Relationship="AdventureWorksModel.LineItem_Order_SalesOrderID" FromRole="LineItem" ToRole="Order" />
</EntityType>
<EntityType Name="Order">
<Key>
<PropertyRef Name="SalesOrderID" />
</Key>
<Property Name="SalesOrderID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="RevisionNumber" Type="Byte" Nullable="false" />
<Property Name="OrderDate" Type="DateTime" Nullable="false" />
<Property Name="DueDate" Type="DateTime" Nullable="false" />
<Property Name="ShipDate" Type="DateTime" />
<Property Name="Status" Type="Byte" Nullable="false" />
<Property Name="OnlineOrderFlag" Type="Boolean" Nullable="false" />
<Property Name="CustomerID" Type="Int32" Nullable="false" />
<Property Name="ContactID" Type="Int32" Nullable="false" />
<Property Name="SalesPersonID" Type="Int32" />
<Property Name="TerritoryID" Type="Int32" />
<Property Name="BillToAddressID" Type="Int32" Nullable="false" />
<Property Name="ShipToAddressID" Type="Int32" Nullable="false" />
<Property Name="ShipMethodID" Type="Int32" Nullable="false" />
<Property Name="CreditCardID" Type="Int32" />
<Property Name="CreditCardApprovalCode" Type="String" MaxLength="15" Unicode="false" FixedLength="false" />
<Property Name="CurrencyRateID" Type="Int32" />
<Property Name="SubTotal" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="TaxAmt" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="Freight" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="TotalDue" Type="Decimal" Nullable="false" Precision="19" Scale="4" annotation:StoreGeneratedPattern="Computed" />
<Property Name="rowguid" Type="Guid" Nullable="false" />
<Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
<NavigationProperty Name="LineItems" Relationship="AdventureWorksModel.LineItem_Order_SalesOrderID" FromRole="Order" ToRole="LineItem" />
<Property Name="ExtendedInfo" Type="AdventureWorksModel.OrderInfo" Nullable="false" />
<NavigationProperty Name="Contact" Relationship="AdventureWorksModel.Order_Contact_ContactID" FromRole="Order" ToRole="Contact" />
</EntityType>
<Association Name="LineItem_Order_SalesOrderID">
<End Role="Order" Type="AdventureWorksModel.Order" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="LineItem" Type="AdventureWorksModel.LineItem" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Order">
<PropertyRef Name="SalesOrderID" />
</Principal>
<Dependent Role="LineItem">
<PropertyRef Name="SalesOrderID" />
</Dependent>
</ReferentialConstraint>
</Association>
<ComplexType Name="OrderInfo">
<Property Type="String" Name="Comment" MaxLength="128" FixedLength="false" Unicode="true" />
<Property Type="String" Name="AccountNumber" MaxLength="15" FixedLength="false" Unicode="true" />
<Property Type="String" Name="PurchaseOrderNumber" MaxLength="25" FixedLength="false" Unicode="true" />
<Property Type="String" Name="SalesOrderNumber" Nullable="false" MaxLength="25" FixedLength="false" Unicode="true" /></ComplexType>
<EntityType Name="Contact">
<Key>
<PropertyRef Name="ContactID" /></Key>
<Property Type="Int32" Name="ContactID" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Type="Boolean" Name="NameStyle" Nullable="false" />
<Property Type="String" Name="Title" MaxLength="8" FixedLength="false" Unicode="true" />
<Property Type="String" Name="FirstName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
<Property Type="String" Name="MiddleName" MaxLength="50" FixedLength="false" Unicode="true" />
<Property Type="String" Name="LastName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
<Property Type="String" Name="Suffix" MaxLength="10" FixedLength="false" Unicode="true" />
<Property Type="String" Name="EmailAddress" MaxLength="50" FixedLength="false" Unicode="true" />
<Property Type="Int32" Name="EmailPromotion" Nullable="false" />
<Property Type="String" Name="Phone" MaxLength="25" FixedLength="false" Unicode="true" />
<Property Type="String" Name="PasswordHash" Nullable="false" MaxLength="128" FixedLength="false" Unicode="false" />
<Property Type="String" Name="PasswordSalt" Nullable="false" MaxLength="10" FixedLength="false" Unicode="false" />
<Property Type="String" Name="AdditionalContactInfo" MaxLength="Max" FixedLength="false" Unicode="true" />
<Property Type="Guid" Name="rowguid" Nullable="false" />
<Property Type="DateTime" Name="ModifiedDate" Nullable="false" />
<NavigationProperty Name="Orders" Relationship="AdventureWorksModel.Order_Contact_ContactID" FromRole="Contact" ToRole="Order" /></EntityType>
<Association Name="Order_Contact_ContactID">
<End Type="AdventureWorksModel.Contact" Role="Contact" Multiplicity="1" />
<End Type="AdventureWorksModel.Order" Role="Order" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Contact">
<PropertyRef Name="ContactID" /></Principal>
<Dependent Role="Order">
<PropertyRef Name="ContactID" /></Dependent></ReferentialConstraint></Association>
</Schema>
В следующий MSL-файл было внесено сопоставление пользовательских классов данных Contact, Orders и LineItem с таблицами Contact, SalesOrderHeader и SalesOrderDetail в базе данных AdventureWorks.
<Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
<EntityContainerMapping StorageEntityContainer="AdventureWorksModelStoreContainer" CdmEntityContainer="AdventureWorksEntities">
<EntitySetMapping Name="LineItemSet">
<EntityTypeMapping TypeName="AdventureWorksModel.LineItem">
<MappingFragment StoreEntitySet="SalesOrderDetail">
<ScalarProperty Name="SalesOrderID" ColumnName="SalesOrderID" />
<ScalarProperty Name="SalesOrderDetailID" ColumnName="SalesOrderDetailID" />
<ScalarProperty Name="CarrierTrackingNumber" ColumnName="CarrierTrackingNumber" />
<ScalarProperty Name="OrderQty" ColumnName="OrderQty" />
<ScalarProperty Name="ProductID" ColumnName="ProductID" />
<ScalarProperty Name="SpecialOfferID" ColumnName="SpecialOfferID" />
<ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" />
<ScalarProperty Name="UnitPriceDiscount" ColumnName="UnitPriceDiscount" />
<ScalarProperty Name="LineTotal" ColumnName="LineTotal" />
<ScalarProperty Name="rowguid" ColumnName="rowguid" />
<ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="OrderSet">
<EntityTypeMapping TypeName="AdventureWorksModel.Order">
<MappingFragment StoreEntitySet="SalesOrderHeader">
<ScalarProperty Name="SalesOrderID" ColumnName="SalesOrderID" />
<ScalarProperty Name="RevisionNumber" ColumnName="RevisionNumber" />
<ScalarProperty Name="OrderDate" ColumnName="OrderDate" />
<ScalarProperty Name="DueDate" ColumnName="DueDate" />
<ScalarProperty Name="ShipDate" ColumnName="ShipDate" />
<ScalarProperty Name="Status" ColumnName="Status" />
<ScalarProperty Name="OnlineOrderFlag" ColumnName="OnlineOrderFlag" />
<ScalarProperty Name="CustomerID" ColumnName="CustomerID" />
<ScalarProperty Name="ContactID" ColumnName="ContactID" />
<ScalarProperty Name="SalesPersonID" ColumnName="SalesPersonID" />
<ScalarProperty Name="TerritoryID" ColumnName="TerritoryID" />
<ScalarProperty Name="BillToAddressID" ColumnName="BillToAddressID" />
<ScalarProperty Name="ShipToAddressID" ColumnName="ShipToAddressID" />
<ScalarProperty Name="ShipMethodID" ColumnName="ShipMethodID" />
<ScalarProperty Name="CreditCardID" ColumnName="CreditCardID" />
<ScalarProperty Name="CreditCardApprovalCode" ColumnName="CreditCardApprovalCode" />
<ScalarProperty Name="CurrencyRateID" ColumnName="CurrencyRateID" />
<ScalarProperty Name="SubTotal" ColumnName="SubTotal" />
<ScalarProperty Name="TaxAmt" ColumnName="TaxAmt" />
<ScalarProperty Name="Freight" ColumnName="Freight" />
<ScalarProperty Name="TotalDue" ColumnName="TotalDue" />
<ScalarProperty Name="rowguid" ColumnName="rowguid" />
<ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
<ComplexProperty Name="ExtendedInfo">
<ScalarProperty Name="SalesOrderNumber" ColumnName="SalesOrderNumber" />
<ScalarProperty Name="PurchaseOrderNumber" ColumnName="PurchaseOrderNumber" />
<ScalarProperty Name="AccountNumber" ColumnName="AccountNumber" />
<ScalarProperty Name="Comment" ColumnName="Comment" />
</ComplexProperty>
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="ContactSet">
<EntityTypeMapping TypeName="AdventureWorksModel.Contact">
<MappingFragment StoreEntitySet="Contact">
<ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
<ScalarProperty Name="rowguid" ColumnName="rowguid" />
<ScalarProperty Name="AdditionalContactInfo" ColumnName="AdditionalContactInfo" />
<ScalarProperty Name="PasswordSalt" ColumnName="PasswordSalt" />
<ScalarProperty Name="PasswordHash" ColumnName="PasswordHash" />
<ScalarProperty Name="Phone" ColumnName="Phone" />
<ScalarProperty Name="EmailPromotion" ColumnName="EmailPromotion" />
<ScalarProperty Name="EmailAddress" ColumnName="EmailAddress" />
<ScalarProperty Name="Suffix" ColumnName="Suffix" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="MiddleName" ColumnName="MiddleName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="Title" ColumnName="Title" />
<ScalarProperty Name="NameStyle" ColumnName="NameStyle" />
<ScalarProperty Name="ContactID" ColumnName="ContactID" /></MappingFragment></EntityTypeMapping></EntitySetMapping>
</EntityContainerMapping>
</Mapping>
Следующий SSDL-файл был настроен для поддержки пользовательских классов данных Contact, Orders и LineItem с помощью таблиц Contact, SalesOrderHeader и SalesOrderDetail в базе данных AdventureWorks.
<Schema Namespace="AdventureWorksModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="https://schemas.microsoft.com/ado/2009/02/edm/ssdl">
<EntityContainer Name="AdventureWorksModelStoreContainer">
<EntitySet Name="Contact" EntityType="AdventureWorksModel.Store.Contact" store:Type="Tables" Schema="Person" />
<EntitySet Name="SalesOrderDetail" EntityType="AdventureWorksModel.Store.SalesOrderDetail" store:Type="Tables" Schema="Sales" />
<EntitySet Name="SalesOrderHeader" EntityType="AdventureWorksModel.Store.SalesOrderHeader" store:Type="Tables" Schema="Sales" />
<AssociationSet Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID" Association="AdventureWorksModel.Store.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
<End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
<End Role="SalesOrderDetail" EntitySet="SalesOrderDetail" />
</AssociationSet>
<AssociationSet Name="FK_SalesOrderHeader_Contact_ContactID" Association="AdventureWorksModel.Store.FK_SalesOrderHeader_Contact_ContactID">
<End Role="Contact" EntitySet="Contact" />
<End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Contact">
<Key>
<PropertyRef Name="ContactID" />
</Key>
<Property Name="ContactID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="NameStyle" Type="bit" Nullable="false" />
<Property Name="Title" Type="nvarchar" MaxLength="8" />
<Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="50" />
<Property Name="MiddleName" Type="nvarchar" MaxLength="50" />
<Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
<Property Name="Suffix" Type="nvarchar" MaxLength="10" />
<Property Name="EmailAddress" Type="nvarchar" MaxLength="50" />
<Property Name="EmailPromotion" Type="int" Nullable="false" />
<Property Name="Phone" Type="nvarchar" MaxLength="25" />
<Property Name="PasswordHash" Type="varchar" Nullable="false" MaxLength="128" />
<Property Name="PasswordSalt" Type="varchar" Nullable="false" MaxLength="10" />
<Property Name="AdditionalContactInfo" Type="xml" />
<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
<Property Name="ModifiedDate" Type="datetime" Nullable="false" />
</EntityType>
<EntityType Name="SalesOrderDetail">
<Key>
<PropertyRef Name="SalesOrderID" />
<PropertyRef Name="SalesOrderDetailID" />
</Key>
<Property Name="SalesOrderID" Type="int" Nullable="false" />
<Property Name="SalesOrderDetailID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="CarrierTrackingNumber" Type="nvarchar" MaxLength="25" />
<Property Name="OrderQty" Type="smallint" Nullable="false" />
<Property Name="ProductID" Type="int" Nullable="false" />
<Property Name="SpecialOfferID" Type="int" Nullable="false" />
<Property Name="UnitPrice" Type="money" Nullable="false" />
<Property Name="UnitPriceDiscount" Type="money" Nullable="false" />
<Property Name="LineTotal" Type="numeric" Nullable="false" Precision="38" Scale="6" StoreGeneratedPattern="Computed" />
<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
<Property Name="ModifiedDate" Type="datetime" Nullable="false" />
</EntityType>
<EntityType Name="SalesOrderHeader">
<Key>
<PropertyRef Name="SalesOrderID" />
</Key>
<Property Name="SalesOrderID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="RevisionNumber" Type="tinyint" Nullable="false" />
<Property Name="OrderDate" Type="datetime" Nullable="false" />
<Property Name="DueDate" Type="datetime" Nullable="false" />
<Property Name="ShipDate" Type="datetime" />
<Property Name="Status" Type="tinyint" Nullable="false" />
<Property Name="OnlineOrderFlag" Type="bit" Nullable="false" />
<Property Name="SalesOrderNumber" Type="nvarchar" Nullable="false" MaxLength="25" StoreGeneratedPattern="Computed" />
<Property Name="PurchaseOrderNumber" Type="nvarchar" MaxLength="25" />
<Property Name="AccountNumber" Type="nvarchar" MaxLength="15" />
<Property Name="CustomerID" Type="int" Nullable="false" />
<Property Name="ContactID" Type="int" Nullable="false" />
<Property Name="SalesPersonID" Type="int" />
<Property Name="TerritoryID" Type="int" />
<Property Name="BillToAddressID" Type="int" Nullable="false" />
<Property Name="ShipToAddressID" Type="int" Nullable="false" />
<Property Name="ShipMethodID" Type="int" Nullable="false" />
<Property Name="CreditCardID" Type="int" />
<Property Name="CreditCardApprovalCode" Type="varchar" MaxLength="15" />
<Property Name="CurrencyRateID" Type="int" />
<Property Name="SubTotal" Type="money" Nullable="false" />
<Property Name="TaxAmt" Type="money" Nullable="false" />
<Property Name="Freight" Type="money" Nullable="false" />
<Property Name="TotalDue" Type="money" Nullable="false" StoreGeneratedPattern="Computed" />
<Property Name="Comment" Type="nvarchar" MaxLength="128" />
<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
<Property Name="ModifiedDate" Type="datetime" Nullable="false" />
</EntityType>
<Association Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
<End Role="SalesOrderHeader" Type="AdventureWorksModel.Store.SalesOrderHeader" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="SalesOrderDetail" Type="AdventureWorksModel.Store.SalesOrderDetail" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="SalesOrderHeader">
<PropertyRef Name="SalesOrderID" />
</Principal>
<Dependent Role="SalesOrderDetail">
<PropertyRef Name="SalesOrderID" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_SalesOrderHeader_Contact_ContactID">
<End Role="Contact" Type="AdventureWorksModel.Store.Contact" Multiplicity="1" />
<End Role="SalesOrderHeader" Type="AdventureWorksModel.Store.SalesOrderHeader" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Contact">
<PropertyRef Name="ContactID" />
</Principal>
<Dependent Role="SalesOrderHeader">
<PropertyRef Name="ContactID" />
</Dependent>
</ReferentialConstraint>
</Association>
</Schema>
См. также
Основные понятия
Настройка объектов (платформа Entity Framework)