Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Не обновляется DomainDataSource.Data при удалении записи / 17 сообщений из 17, страница 1 из 1
21.06.2011, 12:35
    #37317640
Balda_1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не обновляется DomainDataSource.Data при удалении записи
Приложение на 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
21.06.2011, 14:13
    #37317933
Balda_1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не обновляется DomainDataSource.Data при удалении записи
Такое поведение проявляется в 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
21.06.2011, 15:32
    #37318183
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не обновляется DomainDataSource.Data при удалении записи
Balda_1,

нет, ваше предположение не верно, это из-за того, что вы используете более одного DomainContext в вашем приложении, поищите в этой ветке форума, я описывал как реализовать один единственный DomainContext.
...
Рейтинг: 0 / 0
21.06.2011, 16:45
    #37318356
Balda_1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не обновляется DomainDataSource.Data при удалении записи
Если использовать один 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
21.06.2011, 17:21
    #37318452
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не обновляется DomainDataSource.Data при удалении записи
Balda_1,

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

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

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

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

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

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

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

ну тогда не знаю чем вам помочь, ошибка явно говорит, что записи находятся в разных DomainContext.
...
Рейтинг: 0 / 0
22.06.2011, 12:15
    #37319711
Balda_1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не обновляется DomainDataSource.Data при удалении записи
Вот такой код работает, т.е. строка удаляется из базы:
Код: 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
24.06.2011, 19:31
    #37324261
Юрий_Ш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не обновляется DomainDataSource.Data при удалении записи
GetNewBindingList вам в помощь.
...
Рейтинг: 0 / 0
24.06.2011, 19:36
    #37324266
Юрий_Ш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не обновляется DomainDataSource.Data при удалении записи
DataContext содержит строки, умеющие сообщять от том, что они изменились (изменение свойств). а вот изменение состава списков DataContext не поддерживает, т.к. это модель ДАННЫХ. Посмотрите MVVM еще. Оттуда ноги то растут...
...
Рейтинг: 0 / 0
30.06.2011, 10:35
    #37330111
Balda_1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не обновляется DomainDataSource.Data при удалении записи
Юрий_Ш,
Спасибо, буду копать )
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Не обновляется DomainDataSource.Data при удалении записи / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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