Как определить модель с одной сущностью, сопоставленной с двумя таблицами

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

Bb896233.note(ru-ru,VS.100).gifПримечание
Рекомендуется определять модель с типом сущности, сопоставленным с несколькими таблицами, с помощью ADO.NET Entity Data Model Tools.Дополнительные сведения см. в разделе Walkthrough: Mapping an Entity to Multiple Tables.

Сопоставление типа сущности с несколькими таблицами допустимо исключительно при следующих условиях.

  • В таблицах, с которыми сопоставляется тип сущности, имеется общий ключ.

  • Сопоставляемый тип сущности имеет записи в каждой из базовых таблиц. Другими словами, тип сущности представляет данные, имеющие связь типа «один к одному» между двумя таблицами; тип сущности представляет внутреннее соединение двух таблиц.

Ниже представлены основные действия для определения вручную модели с сущностью, сопоставленной с двумя таблицами.

  1. Определите тип сущности со свойствами, соответствующими столбцам в каждой их базовых таблиц. Дополнительные сведения см. в разделе Элемент EntityType (язык CSDL).

  2. Определите сопоставление для типа сущности с помощью элемента MappingFragment для каждой из базовых таблиц. Дополнительные сведения см. в разделах Элемент EntityTypeMapping (язык MSL) и Элемент MappingFragment (язык MSL).

В следующем примере предполагается, что установлен образец базы данных School, а в проекте вручную разрешено использование Entity Framework . Дополнительные сведения см. в разделах Создание образца базы данных School (краткое руководство по Entity Framework) и Настройка платформы Entity Framework (задачи Entity Framework).

Bb896233.note(ru-ru,VS.100).gifПримечание
В примере ниже описано сопоставление типа сущности с таблицами Person и OfficeAssignement в образце базы данных School.Обратите внимание, что условия сопоставления типа сущности с данными таблицами соблюдены. А именно, внутреннее соединение двух таблиц в результате охватит всех преподавателей, за которыми закреплены аудитории.

Создание модели хранения

  1. Добавьте в проект следующий XML-файл и задайте для него имя School.ssdl.

    <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" 
            ProviderManifestToken="2008" 
            xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" 
            xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
      <EntityContainer Name="SchoolModelStoreContainer">
        <EntitySet Name="OfficeAssignment" EntityType="SchoolModel.Store.OfficeAssignment" 
                   store:Type="Tables" Schema="dbo" />
        <EntitySet Name="Person" EntityType="SchoolModel.Store.Person" 
                   store:Type="Tables" Schema="dbo" />
      </EntityContainer>
      <EntityType Name="OfficeAssignment">
        <Key>
          <PropertyRef Name="InstructorID" />
        </Key>
        <Property Name="InstructorID" Type="int" Nullable="false" />
        <Property Name="Location" Type="nvarchar" Nullable="false" MaxLength="50" />
        <Property Name="Timestamp" Type="timestamp" Nullable="false" 
                  StoreGeneratedPattern="Computed" />
      </EntityType>
      <EntityType Name="Person">
        <Key>
          <PropertyRef Name="PersonID" />
        </Key>
        <Property Name="PersonID" Type="int" Nullable="false" 
                  StoreGeneratedPattern="Identity" />
        <Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
        <Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="50" />
        <Property Name="HireDate" Type="datetime" />
        <Property Name="EnrollmentDate" Type="datetime" />
      </EntityType>
    </Schema>
    

Создание концептуальной модели

  1. Добавьте в проект следующий XML-файл и задайте для него имя School.csdl. Обратите внимание на следующие моменты.

    • Тип сущности Instructor имеет свойства, сопоставляемые со всеми столбцами таблиц Person и OfficeAssignment (подробности см. в представленном выше описании модели хранения).

      Bb896233.note(ru-ru,VS.100).gifПримечание
      Поскольку тип сущности Instructor является унаследованным, он наследует все свойства соответствующего ему базового типа, Person.Помимо свойств, присущих исключительно типу Instructor, тип сущности Instructor также имеет свойства, сопоставляемые со всеми столбцами базовых таблиц.

    <Schema Namespace="SchoolModel" Alias="Self" 
            xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" 
            xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
      <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true">
        <EntitySet Name="People" EntityType="SchoolModel.Person" />
      </EntityContainer>
      <EntityType Name="Person">
        <Key>
          <PropertyRef Name="PersonID" />
        </Key>
        <Property Type="Int32" Name="PersonID" Nullable="false" 
                  annotation:StoreGeneratedPattern="Identity" />
        <Property Type="String" Name="LastName" Nullable="false" 
                  MaxLength="50" FixedLength="false" Unicode="true" />
        <Property Type="String" Name="FirstName" Nullable="false" 
                  MaxLength="50" FixedLength="false" Unicode="true" />
        <Property Type="DateTime" Name="EnrollmentDate" />
      </EntityType>
      <EntityType Name="Instructor" BaseType="SchoolModel.Person" >
        <Property Type="DateTime" Name="HireDate" Nullable="false" />
        <Property Type="Binary" Name="Timestamp" Nullable="false" 
                  MaxLength="8" FixedLength="true" 
                  annotation:StoreGeneratedPattern="Computed" />
        <Property Type="String" Name="Location" Nullable="false" 
                  MaxLength="50" FixedLength="false" Unicode="true" />
      </EntityType>
    </Schema>
    

Определение сопоставления между концептуальной моделью и моделью хранения

  1. Добавьте в проект следующий XML-файл и задайте для него имя School.msl. Обратите внимание на следующие моменты.

    • В пределах элемента EntityTypeMapping для типа сущности Instructor отдельные элементы MappingFragment используются для сопоставления свойств с соответствующими таблицами.
    <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
        <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" 
                                CdmEntityContainer="SchoolEntities">
          <EntitySetMapping Name="People">
            <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Instructor)">
              <MappingFragment StoreEntitySet="Person">
                <ScalarProperty Name="PersonID" ColumnName="PersonID" />
                <ScalarProperty Name="HireDate" ColumnName="HireDate" />
                <Condition ColumnName="HireDate" IsNull="false" />
              </MappingFragment>
              <MappingFragment StoreEntitySet="OfficeAssignment">
                <ScalarProperty Name="PersonID" ColumnName="InstructorID" />
                <ScalarProperty Name="Timestamp" ColumnName="Timestamp" />
                <ScalarProperty Name="Location" ColumnName="Location" />
              </MappingFragment>
            </EntityTypeMapping>
            <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Person)">
              <MappingFragment StoreEntitySet="Person">
                <ScalarProperty Name="PersonID" ColumnName="PersonID" />
                <ScalarProperty Name="LastName" ColumnName="LastName" />
                <ScalarProperty Name="FirstName" ColumnName="FirstName" />
                <ScalarProperty Name="EnrollmentDate" ColumnName="EnrollmentDate" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
        </EntityContainerMapping>
    </Mapping>
    

См. также

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

Спецификации языка CSDL, SSDL и MSL
Определение расширенных моделей данных (задачи платформы Entity Framework)