<riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:PersonalInfo, CreateList=true}" Height="0" LoadedData="personalInfoDomainDataSource_LoadedData" Name="personalInfoDomainDataSource" QueryName="GetPersonalInfoesQuery" Width="0">
<riaControls:DomainDataSource.DomainContext>
<my1:EmployeesDomainContext />
</riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>
<toolkit:BusyIndicator Name="busyIndicator"
BusyContent="Loading..." IsBusy="{Binding IsBusy, ElementName=personalInfoDomainDataSource}">
<StackPanel Name="contentPanel" Orientation="Horizontal">
<sdk:DataGrid IsReadOnly="True" AutoGenerateColumns="False"
ItemsSource="{Binding ElementName=personalInfoDomainDataSource, Path=Data}"
Name="personalInfoDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=FirstName}" Header="First Name" Width="Auto" />
<sdk:DataGridTextColumn x:Name="lastNameColumn" Binding="{Binding Path=LastName}" Header="Last Name" Width="Auto" />
<sdk:DataGridTemplateColumn x:Name="birthDateColumn" Header="Birth Date" Width="Auto">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=BirthDate, StringFormat=\{0:d\}}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
<toolkit:DataForm Name="employeeDataForm" Header="Employee Details"
AutoGenerateFields="True" AutoCommit="False" AutoEdit="False"
AutoGeneratingField="employeeDataForm_AutoGeneratingField"
EditEnded="employeeDataForm_EditEnded" DeletingItem="employeeDataForm_DeletingItem"
CurrentItem="{Binding ElementName=personalInfoDataGrid, Path=SelectedItem, Mode=TwoWay}"
ItemsSource="{Binding ElementName=personalInfoDomainDataSource, Path=Data}">
</toolkit:DataForm>
</StackPanel>
</toolkit:BusyIndicator>
Не обновляется DomainDataSource.Data при удалении записи
Есть связанные DataGrid и DataForm с единым источником данных DomainDataSource:
Код:
Добавление и изменение записей обрабатывается в EditEnded DataForm:
Код:
private void employeeDataForm_EditEnded(object sender, DataFormEditEndedEventArgs e)
{
if (e.EditAction == DataFormEditAction.Commit)
{
personalInfoDomainDataSource.SubmitChanges();
}
else
{
personalInfoDomainDataSource.RejectChanges();
}
}
{
if (e.EditAction == DataFormEditAction.Commit)
{
personalInfoDomainDataSource.SubmitChanges();
}
else
{
personalInfoDomainDataSource.RejectChanges();
}
}
Удаление записи - в DeletingItem DataForm:
Код:
private void employeeDataForm_DeletingItem(object sender, System.ComponentModel.CancelEventArgs e)
{
employeeDataForm.CommitEdit();
var currentEmpl = (PersonalInfo)employeeDataForm.CurrentItem;
var ctx = (EmployeesDomainContext)personalInfoDomainDataSource.DomainContext;
ctx.PersonalInfos.Remove(currentEmpl);
ctx.SubmitChanges();
}
{
employeeDataForm.CommitEdit();
var currentEmpl = (PersonalInfo)employeeDataForm.CurrentItem;
var ctx = (EmployeesDomainContext)personalInfoDomainDataSource.DomainContext;
ctx.PersonalInfos.Remove(currentEmpl);
ctx.SubmitChanges();
}
Проблема в том, что при удалении записи не обновляется personalInfoDomainDataSource.Data, т.е. в базе данных записи уже нет, а на странице она все ещё отображается. Причем такое поведение проявляется только при удалении только что добавленной записи (старые записи удаляются нормально).
В чем моя ошибка?
Если тестировать в IE вылетает сообщение об ошибке:
The specified entity is not contained in this EntitySet.
at System.ServiceModel.DomainServices.Client.EntitySet.Remove(Entity entity)
at System.Windows.Controls.PagedEntityCollectionView.RemoveCore(Entity item, Int32 index)
at System.Windows.Controls.PagedEntityCollectionView.RemoveIndex(Int32 index)
at System.Windows.Controls.EntityCollectionView.RemoveAt(Int32 index)
at System.Windows.Controls.DomainDataSourceView.RemoveAt(Int32 index)
at System.Windows.Controls.DataForm.DeleteItem()
at System.Windows.Controls.DataForm.OnDeleteItemButtonClick(Object sender, RoutedEventArgs e)
at System.Windows.Controls.Primitives.ButtonBase.OnClick()
at System.Windows.Controls.Button.OnClick()
at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
Скорее всего это из-за того, что ключевое поле ID для PersonalInfo генерируется автоинкрементом в БД.
Поэтому при добавлении новой записи ID устанавливается в 0, в контексте запоминается запись с ID=0.
А когда пытаемся удалить эту запись уже подтягивается новый ID из БД, из-за чего и возникает несоответствие.
Отсюда вопрос: как это обойти?
Проблема решена. Если кому-то пригодится: помогла реализация единого DomainContext в ресурсах приложения.