Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не обновляется DomainDataSource.Data при удалении записи

6.0K
21 июня 2011 года
Balda
79 / / 12.05.2008
Приложение на silverlight 4, VS 2010.
Есть связанные DataGrid и DataForm с единым источником данных DomainDataSource:
Код:
<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>


Добавление и изменение записей обрабатывается в EditEnded DataForm:
Код:
private void employeeDataForm_EditEnded(object sender, DataFormEditEndedEventArgs e)
        {
            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();
        }


Проблема в том, что при удалении записи не обновляется personalInfoDomainDataSource.Data, т.е. в базе данных записи уже нет, а на странице она все ещё отображается. Причем такое поведение проявляется только при удалении только что добавленной записи (старые записи удаляются нормально).

В чем моя ошибка?
6.0K
21 июня 2011 года
Balda
79 / / 12.05.2008
Такое поведение проявляется в FireFox.
Если тестировать в 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 из БД, из-за чего и возникает несоответствие.

Отсюда вопрос: как это обойти?
6.0K
23 июня 2011 года
Balda
79 / / 12.05.2008
Проблема решена. Если кому-то пригодится: помогла реализация единого DomainContext в ресурсах приложения.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог