Я занимаюсь разработкой простого приложения 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 '*'.