powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Не обновляется DomainDataSource.Data при удалении записи
17 сообщений из 17, страница 1 из 1
Не обновляется DomainDataSource.Data при удалении записи
    #37317640
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приложение на silverlight 4, VS 2010.
Есть связанные DataGrid и DataForm с единым источником данных DomainDataSource:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<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:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
private void employeeDataForm_EditEnded(object sender, DataFormEditEndedEventArgs e)
        {
            if (e.EditAction == DataFormEditAction.Commit)
            {
                personalInfoDomainDataSource.SubmitChanges();
            }
            else
            {
                personalInfoDomainDataSource.RejectChanges();
            }
        }

Удаление записи - в DeletingItem DataForm:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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, т.е. в базе данных записи уже нет, а на странице она все ещё отображается. Причем такое поведение проявляется только при удалении только что добавленной записи (старые записи удаляются нормально).

В чем моя ошибка?
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37317933
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такое поведение проявляется в 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 из БД, из-за чего и возникает несоответствие.

Отсюда вопрос: как это обойти?
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318183
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Balda_1,

нет, ваше предположение не верно, это из-за того, что вы используете более одного DomainContext в вашем приложении, поищите в этой ветке форума, я описывал как реализовать один единственный DomainContext.
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318356
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если использовать один DomainDataSource, то в DataForm не подгружаются связанные данные, отображаемые в ComboBox'ах.
Для отображения связанных данных именно комбобоксами, а не текстбоксами, которые подтягиваются автоматом, я использую следующий код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
private void employeeDataForm_AutoGeneratingField(object sender, DataFormAutoGeneratingFieldEventArgs e)
        {
            //подменяю контрол для поля на комбобокс
            if (e.PropertyName == "FamilyStatus")
            {
               var ctx = ResourceWrapper.CurrentDomainContext;
               var status = ctx.Load(ctx.GetFamilyStatusQuery(), OnGetStatus, e.Field).Entities;
            }
            if (e.PropertyName == "Position")
            {
                var ctx = ResourceWrapper.CurrentDomainContext;
                var position = ctx.Load(ctx.GetPositionsQuery(), OnGetPosition, e.Field).Entities;
            }
        }

        public void OnGetStatus(LoadOperation loadOperation)
        {
            //привязываем SelectedItem комбобокса к свойству FamilyStatus
            Binding binding = new Binding("FamilyStatus");
            binding.Mode = BindingMode.TwoWay;
            var statusComboBox = new ComboBox();
            statusComboBox.ItemsSource = loadOperation.Entities;
            statusComboBox.DisplayMemberPath = "StatusName";
            statusComboBox.SetBinding(ComboBox.SelectedItemProperty, binding);
            var item = loadOperation.UserState as DataField;
            item.Content = statusComboBox;
            //делаем комбобокс активным
            Binding editableBinding = new Binding() { ElementName = "employeeDataForm", Path = new PropertyPath("Mode"), Converter = new InverseModeConvertor() };
            item.SetBinding(DataField.IsReadOnlyProperty, editableBinding);
        }

        public void OnGetPosition(LoadOperation loadOperation)
        {
            //привязываем SelectedItem комбобокса к свойству Position
            Binding binding = new Binding("Position");
            binding.Mode = BindingMode.TwoWay;
            var positionComboBox = new ComboBox();
            positionComboBox.ItemsSource = loadOperation.Entities;
            positionComboBox.DisplayMemberPath = "PositionName";
            positionComboBox.SetBinding(ComboBox.SelectedItemProperty, binding);
            var item = loadOperation.UserState as DataField;
            item.Content = positionComboBox;
            //делаем комбобокс активным
            Binding editableBinding = new Binding() { ElementName = "employeeDataForm", Path = new PropertyPath("Mode"), Converter = new InverseModeConvertor() };
            item.SetBinding(DataField.IsReadOnlyProperty, editableBinding);
        }

Кроме того, в режиме редактирования, при поыптке изменить значения в комюоюоксах вылетает ошибка:
Entity 'FamilyStatus : 1' cannot be attached to this EntityContainer because it is already attached to another EntityContainer.
at System.ServiceModel.DomainServices.Client.EntityContainer.CheckCrossContainer(Entity entity)
at System.ServiceModel.DomainServices.Client.EntityRef`1.set_Entity(TEntity value)
at TestEmployees.Web.Models.PersonalInfo.set_FamilyStatu(FamilyStatu value)

Как можно реализовать нормальное отображения связанных данных комбобоксами без задания шаблона отображения DataForm вручную?
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318452
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Balda_1,

еще раз прочитайте мой ответ выше, я говорю про единый DomainContext для всего приложения, а не про DomainDataSource.

пока вы этого не реализуете, вы будете получать ошибку
авторEntity 'FamilyStatus : 1' cannot be attached to this EntityContainer because it is already attached to another EntityContainer.
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318481
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уТКа,

извините, в моём прошлом сообщении опечатка: реализован не один DomainDataSource, а единый DomainContext в статических ресурсах приложения.

Но связанные данные всё равно не подтягиваются, и описанная выше ошибка не исчезает.
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318573
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Balda_1,

Подскажите, пожалуйста, что я делаю не правильно:

1. Создаю в статических ресурсах единый DomainContext
Код: plaintext
1.
<appWeb:EmployeesDomainContext x:Key="DomainContext"/>
2. В app.xaml добавляю описание ресурса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Assets/Styles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
3. на странице использую единый DomainContext
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
<riaControls:DomainDataSource AutoLoad="True" 
                                          Name="personalInfoDomainDataSource" QueryName="GetPersonalInfoesQuery" 
                                          DataContext="{Binding Source={StaticResource DomainContext}}" />

            <toolkit:BusyIndicator Name="busyIndicator" Grid.Row="1"
                                   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.CellEditingTemplate>
                                        <DataTemplate>
                                            <sdk:DatePicker SelectedDate="{Binding Path=BirthDate, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" />
                                        </DataTemplate>
                                    </sdk:DataGridTemplateColumn.CellEditingTemplate>
                                    <sdk:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding Path=BirthDate, StringFormat=\{0:d\}}" />
                                        </DataTemplate>
                                    </sdk:DataGridTemplateColumn.CellTemplate>
                                </sdk:DataGridTemplateColumn>
                                <sdk:DataGridTextColumn x:Name="addressColumn" Binding="{Binding Path=Address}" Header="Address" Width="Auto" />
                                <sdk:DataGridTextColumn x:Name="telephoneColumn" Binding="{Binding Path=Telephone}" Header="Telephone" Width="Auto" />
                                <sdk:DataGridTextColumn x:Name="zipCodeColumn" Binding="{Binding Path=ZipCode}" Header="Zip Code" Width="Auto" />
                                <sdk:DataGridTextColumn x:Name="familyStatus" Binding="{Binding FamilyStatu.StatusName}" Header="Family Status" Width="Auto" />
                                <sdk:DataGridTextColumn x:Name="position" Binding="{Binding Position1.PositionName}" Header="Position" Width="Auto" />
                            </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>

В результате отображается пустой грид и пустая DataForm ((
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318574
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Balda_1,

во вашему коду не видно, что вы используете единый DomainContext
автор<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>
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318594
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Balda_1,

если честно, вы используете самый геморный вариант для подгрузки связанных данный в ComboBox-ы, вот тынц , читаем и делаем.
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318624
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уТКа,

да выбранный мной вариант геморный, но при этом не нужно вручную задавать шаблоны отображения для DataForm в разных режимах работы. Хотя, использование ExtendedComboBox по-своему удобно )

Проблема осталась все та же: не заполняется единый DomainContext (даже при использовании ExtendedComboBox).
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318651
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
заполняется если указывать DataContext для DomainDataSource через стили. )
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318685
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С использованием единого DomainContext и ExtendedComboBox остается та же проблема при удалении только что созданной записи:
The specified entity is not contained in this EntitySet.
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37318794
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Balda_1,

ну тогда не знаю чем вам помочь, ошибка явно говорит, что записи находятся в разных DomainContext.
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37319711
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такой код работает, т.е. строка удаляется из базы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
private void employeeDataForm_DeletingItem(object sender, System.ComponentModel.CancelEventArgs e)
        {
            var currentEmpl = (PersonalInfo)personalInfoDataGrid.SelectedItem;
            ResourceWrapper.CurrentDomainContext.PersonalInfos.Remove(currentEmpl);
            ResourceWrapper.CurrentDomainContext.SubmitChanges();
            personalInfoDataGrid.SelectedIndex = -1;
        }

Но при этом удаленная строка продолжает отображатся в гриде...
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37324261
Юрий_Ш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetNewBindingList вам в помощь.
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37324266
Юрий_Ш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DataContext содержит строки, умеющие сообщять от том, что они изменились (изменение свойств). а вот изменение состава списков DataContext не поддерживает, т.к. это модель ДАННЫХ. Посмотрите MVVM еще. Оттуда ноги то растут...
...
Рейтинг: 0 / 0
Не обновляется DomainDataSource.Data при удалении записи
    #37330111
Balda_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юрий_Ш,
Спасибо, буду копать )
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Не обновляется DomainDataSource.Data при удалении записи
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]