Удаление объекта из БД в Silverlight 4 RIA (Entity Framework) - PullRequest
0 голосов
/ 13 января 2012

Я занимаюсь разработкой простого приложения Silverlight 4, основанного на ассоциации «один ко многим».Модель отношения представлена ​​здесь .

Страница состоит из двух сеток, одна загружается прямо из DomainDataSource (одна ExcelTemplate).После выбора ExcelTemplate второй загружается с ColumnValidationRules из ObservableCollection, который заполняется на основе списка ExcelTemplate .У сущностей нет действий OnDelete.У меня много проблем с удалением ColumnValidationRule объектов семейства.В основном я пробовал 2 разных подхода:

  • Удаление только ColumnValidationRule с использованием ColumnValidationRuleDomainDataSource (на основе GetColumnValidationRule запроса):

XAML с моими DomainDataSources:

                                <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:ExcelTemplate, CreateList=true}" Height="0" LoadedData="ExcelTemplateDomainDataSource_LoadedData" Name="excelTemplatesForValidatiorsDDS" QueryName="GetExcelTemplatesQuery" Width="0">
                                    <riaControls:DomainDataSource.DomainContext>
                                        <my1:SRFDomainContext />
                                    </riaControls:DomainDataSource.DomainContext>
                                </riaControls:DomainDataSource>

                                <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:ColumnValidationRule, CreateList=true}" Height="0" LoadedData="ExcelTemplateDomainDataSource_LoadedData" Name="columnValidationRulesDomainDataSource" QueryName="GetColumnValidationRulesQuery" Width="0">
                                    <riaControls:DomainDataSource.DomainContext>
                                        <my1:SRFDomainContext />
                                    </riaControls:DomainDataSource.DomainContext>
                                </riaControls:DomainDataSource>

Код:

     // Filling DataViews:
     this.excelTemplatesForValidatiorsDDS.Load();
     this.columnValidationRulesDomainDataSource.Load();

    // Delete action:
    private void DeleteRuleButton_Click(object sender, RoutedEventArgs e)
    {
        this.columnValidationRulesDomainDataSource.Load();
        ColumnValidationRule cvr = this.srfValidatorsDataGrid.SelectedItem as ColumnValidationRule;
        this.columnValidationRulesDomainDataSource.DataView.Remove(cvr);
    }

В результате я получаю ошибку: Указанная сущность не содержится в этом EntitySet.

Сведения об ошибке:

w System.ServiceModel.DomainServices.Client.EntitySet.Remove(Entity entity)
   w System.Windows.Controls.PagedEntityCollectionView.RemoveCore(Entity item, Int32 index)
   w System.Windows.Controls.PagedEntityCollectionView.RemoveItem(Entity item)
   w System.Windows.Controls.EntityCollectionView.Remove(Object item)
   w System.Windows.Controls.DomainDataSourceView.Remove(Object item)
   w LANOS.UserManagement.DeleteRuleButton_Click(Object sender, RoutedEventArgs e)
   w System.Windows.Controls.Primitives.ButtonBase.OnClick()
   w System.Windows.Controls.Button.OnClick()
   w System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   w System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
   w MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventN

  • Создание другого DomainDataSourceдля каждого из семейств объектов: ColumnValidationRule , AssociatedColumn , ColumnValue .Затем удаляю их, используя эти DomainDataSource и отправляя из хвоста в голову.Этот подход также не удался.У меня была ошибка, аналогичная той, что была в первом подходе.Также время от времени некоторые из этих DomainDataSource были пустыми.

Я гуглил примеры, которые могли бы решить эту проблему, но я не нашел ни одного.Оценивая любые советы, ссылки или помощь;)


ОБНОВЛЕНИЕ 1:

Я использовал ваш совет:

    this.columnValidationRulesDomainDataSource.Load();
    ColumnValidationRule deletedObject = null;

    foreach (ColumnValidationRule cvr in this.columnValidationRulesDomainDataSource.DataView)
    {
        if (cvr.ID.Equals((this.srfValidatorsDataGrid.SelectedItem as ColumnValidationRule).ID))
        {
            deletedObject = cvr;
        }
    }
    this.columnValidationRulesDomainDataSource.DataView.Remove(deletedObject);
    this.columnValidationRulesDomainDataSource.SubmitChanges();

Теперь я получаюэта ошибка: Предоставленный элемент не является экземпляром типа Entity : /


ОБНОВЛЕНИЕ 2:

Я добавил на SubmitedChangesОбработчик событий и, как я подозревал в начале поста, есть проблема с удалением, вызванная Foreign Keys:

e.Error.Message "Submit operation failed. An error occurred while updating the entries. See the inner exception for details. InnerException message: The DELETE statement conflicted with the REFERENCE constraint \"FK_AssociatedColumn_ColumnValidationRule\". The conflict occurred in database \"LANOS\", table \"dbo.AssociatedColumns\", column 'ColumnValidationRuleID'.\r\nThe statement has been terminated."

К сожалению, я не могу настроить модель для использования End On Delete- Каскадная недвижимость.Настройка каскадного удаления вызывает ошибку компиляции:

End 'ColumnValue' on relationship 'LANOSModel.FK_AssociatedColumnColumnValue' cannot have operation specified since its multiplicity is '*'. Operations cannot be specified on ends with multiplicity '*'.

1 Ответ

1 голос
/ 13 января 2012

Причина "указанная сущность не содержится в этом EntitySet" заключается в том, что .... ждите ее ... указанный экземпляр этой сущности на самом деле не содержится в EntitySet.

Вы, очевидно, загрузили сетку данных из предыдущего контекста данных, тогда как this.columnValidationRulesDomainDataSource.Load() создает новый набор сущностей, поэтому вы не можете удалить конкретный старый объект из нового набора данных. Они имеют одинаковые значения, но не являются одинаковыми объектами.

Однако вы можете использовать ключ от объекта и удалить его в новом контексте (где идентификатор совпадает). Сначала найдите соответствующий экземпляр и удалите его.

Если вы можете предоставить более подробную информацию / код, я мог бы привести конкретный пример, но у вас должно быть достаточно, чтобы продолжить.

...