Наследование TPC создает исключение для вставок - PullRequest
0 голосов
/ 29 февраля 2012

В базе данных у меня есть таблицы Reservations и OldReservations, где OldReservations является копией (из таблицы Reservations) и используется для хранения старых резервирований. В обеих таблицах используются автоматически сгенерированные ключи идентификации, но первая имеет начальное число 0, а вторая - начальное число 1000, поэтому значения ключей в этих двух таблицах не перекрываются. Вот шаги, которые я сделал для создания наследования TPC:

1) Я получил OldReservation сущность от Reservation сущности 2) Я удалил перекрывающиеся свойства из OldReservation объекта 3) Затем я сопоставил поля таблицы OldReservations в XML файла EDMX:

      <EntitySetMapping Name="Reservations">
        <EntityTypeMapping TypeName="IsTypeOf(BAModel.Reservation)">
          <MappingFragment StoreEntitySet="Reservations">
            <ScalarProperty Name="ReservationID" ColumnName="ReservationID" />
            <ScalarProperty Name="ReservationDate" ColumnName="ReservationDate" />
            <ScalarProperty Name="EventID" ColumnName="EventID" />
            <ScalarProperty Name="ContactID" ColumnName="ContactID" />
            <ScalarProperty Name="RowVersion" ColumnName="RowVersion" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(BAModel.OldReservation)">
          <MappingFragment StoreEntitySet="OldReservations">
            <ScalarProperty Name="ReservationID" ColumnName="ReservationID" />
            <ScalarProperty Name="ReservationDate" ColumnName="ReservationDate" />
            <ScalarProperty Name="EventID" ColumnName="EventID" />
            <ScalarProperty Name="ContactID" ColumnName="ContactID" />
            <ScalarProperty Name="RowVersion" ColumnName="RowVersion" />
          </MappingFragment>
        </EntityTypeMapping>
      </EntitySetMapping>

После выполнения описанных выше шагов проект компилируется без ошибок, но когда я пытаюсь вставить новую строку в таблицу OldReservations, я получаю:

UpdateException: значение, совместно используемое сущностями или ассоциациями, генерируется в нескольких местах. Убедитесь, что сопоставление не разделяет EntityKey на несколько столбцов, созданных магазином. ---> System.ArgumentException: элемент с тем же ключом уже добавлен.

        var reservation = new OldReservation();
        reservation.ReservationDate = DateTime.Now;
        reservation.ContactID = 129;

        context.Reservations.AddObject(reservation);
        context.SaveChanges();

Это исключение выдается до того, как EF удастся отправить команду вставки в базу данных. Есть идеи, почему я получаю исключение?

Спасибо

1 Ответ

0 голосов
/ 03 марта 2012

Вы получаете это исключение, потому что вы используете IsTypeOf (BAModel.Reservation) вместо просто BAModel.Reservation.Из-за этого не только BAModel.Reservation, но и типы, производные от BAModel.Reservation, отображаются в таблицу Reservation.Так что получается, что OldReservation сопоставляется с таблицей Reservation и таблицей OldReservations.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...