Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / c# ef asnotracking и combobox / 16 сообщений из 16, страница 1 из 1
06.02.2018, 07:24
    #39597189
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Здравствуйте!

Не знаю как правильно настроить работу Combobox (SeletedItem), при использовании в запросу EF метод AsNoTracking(). Проблема в том, что combobox при открытии формы отображается без выбранной позиции. Без использования AsNoTracking(), проблем нет, выбранная позиция отображается при загрузке формы.

Для чего нужен метод AsNoTracking(), я знаю!

Код: xml
1.
ItemSource={ Binding ItemBooks } SeletedItem={ Binding ItemBook, Mode=ToWay, UpdateSourceTrigger=PropertyChange }



Помогите пожалуйста, кто знает в чем причина?
...
Рейтинг: 0 / 0
06.02.2018, 08:53
    #39597210
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Nechto,
1) Проверить установлено ли свойство ItemBook при инициализации ViewModel.
2)Если установлено, но все равно не отображается, то вызвать notifyPropertyChange("ItemBook") после установки свойства.
...
Рейтинг: 0 / 0
06.02.2018, 14:25
    #39597462
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
vb_subNechto,
1) Проверить установлено ли свойство ItemBook при инициализации ViewModel.
2)Если установлено, но все равно не отображается, то вызвать notifyPropertyChange("ItemBook") после установки свойства.

Это я все проверил. Вот пример:

Код: c#
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.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
public class Union
{
    public int Id { get; set; }
    public DictType DictType { get; set; }
    public int? DictTypeId { get; set; }        
}
public class DictType 
{
    public int Id { get; set; }
    public string Name { get; set; }
}


public class Test : INotifyPropertyChanged 
{
    public Test() 
	{
	    var dbContext = new MgsWorkDb(session, false, DatabaseInitializerMgsWorkDb);

        //Union = db.Set<Union>().FirstOrDefault(w => w.DictTypeId != null);                   // Так работает
        Union = db.Set<Union>().AsNoTracking().FirstOrDefault(w => w.DictTypeId != null);    // Так не работает

        DictType = db.Set<DictType>().ToList(); 
	}
	
    private IList<DictType> _dictType;
    public IList<DictType> DictType
    {
        get { return _dictType; }
        private set
        {
            if (!Equals(_dictType, value))
            {
                _dictType = value;
                SetPropertyChanged("DictType");
            }
        }
    }
    private Union _union;
    public Union Union
    {
        get { return _union; }
        private set
        {
            if (!Equals(_union, value))
            {
                _union = value;
                SetPropertyChanged("Union");
            }
        }
    }
	
	public event PropertyChangedEventHandler PropertyChanged;
	protected void SetPropertyChanged(string property)
    {
        var args = new PropertyChangedEventArgs(property);
        if (PropertyChanged != null)
        {
            PropertyChanged(this, args);
        }
    }
}



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfApplication1="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <wpfApplication1:Test />
    </Window.DataContext>
    <Grid>
        <ComboBox Width="300" Height="24" ItemsSource="{Binding DictType}" SelectedItem="{Binding Union.DictType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Name"/>
    </Grid>
</Window>
...
Рейтинг: 0 / 0
06.02.2018, 15:36
    #39597533
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Потому что в случае AsNoTracking() Union который ты получил, и Union, который в словаре - это два разных объекта, один отслеживаемый, другой нет.

Реализуй компаратор на объекте Union
...
Рейтинг: 0 / 0
06.02.2018, 15:39
    #39597535
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Поправлюсь: все то же самое, только про DictType

Shocker.ProПотому что в случае AsNoTracking() DictType который ты получил, и DictType , который в словаре - это два разных объекта, один отслеживаемый, другой нет.

Реализуй компаратор на объекте DictType
...
Рейтинг: 0 / 0
06.02.2018, 15:46
    #39597540
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Еще поправлюсь, не компаратор конечно же, а сравнение эквивалентности
...
Рейтинг: 0 / 0
07.02.2018, 07:16
    #39597868
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Shocker.Pro.

Первое сделал это так. Проверил. Все ровно в combobox не выбрана позиция.
Код: c#
1.
2.
Union = db.Set<Union>().AsNoTracking().FirstOrDefault(w => w.DictTypeId != null);
DictType = db.Set<DictType>().AsNoTracking().ToList(); 



Наверное я вас не понял?
...
Рейтинг: 0 / 0
07.02.2018, 10:26
    #39597967
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Создал конверт и повесил его на свойство SeletedItem - значение DictType приходит. Как заставить его отображаться в combobox???
...
Рейтинг: 0 / 0
07.02.2018, 10:31
    #39597971
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Сейчас это все равно два разных объекта.
Когда включено отслеживание, то когда ты пытаешься повторно получить объект из контекста, тебе будет выдаваться один и тот же объект именно потому, что есть Tracking

Когда ты отключаешь трекинг, контекст тебе отдает каждый раз новый объект. Именно потому, что он не отслеживает те объекты, которые отдал тебе ранее.

И в этом коде Union.DictType и элемент DictType из массива DictType (блин, ну кто так называет переменные, если это у тебя массив, значит DictTypes надо назвать) - это разные экземпляры, они не равны при сравнении по ссылке.

Чтобы они все-таки были равны, тебе нужно реализовать сравнение эквивалентности (по Id будет вполне достаточно), либо использовать в качестве SelectedObject объект взятый именно из коллекции DictType
...
Рейтинг: 0 / 0
07.02.2018, 10:43
    #39597980
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Как же в этом wpf все намешано то, IMHO.
Кэш, VIEW и код банального комобокса.
...
Рейтинг: 0 / 0
07.02.2018, 10:44
    #39597982
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Причем тут wpf вообще?
С этим же успехом ты можешь и винформах на эти же грабли наступить.
...
Рейтинг: 0 / 0
07.02.2018, 10:47
    #39597984
Nechto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Shocker.ProСейчас это все равно два разных объекта.
Когда включено отслеживание, то когда ты пытаешься повторно получить объект из контекста, тебе будет выдаваться один и тот же объект именно потому, что есть Tracking

Когда ты отключаешь трекинг, контекст тебе отдает каждый раз новый объект. Именно потому, что он не отслеживает те объекты, которые отдал тебе ранее.

И в этом коде Union.DictType и элемент DictType из массива DictType (блин, ну кто так называет переменные, если это у тебя массив, значит DictTypes надо назвать) - это разные экземпляры, они не равны при сравнении по ссылке.

Чтобы они все-таки были равны, тебе нужно реализовать сравнение эквивалентности (по Id будет вполне достаточно), либо использовать в качестве SelectedObject объект взятый именно из коллекции DictType

Получилось используя свойство SelectedValue (Union.DictTypeId), вместо SelectedItem и добавив свойство SelectedValuePath.

А как делается сопоставление эквивалентности (по Id будет вполне достаточно)
...
Рейтинг: 0 / 0
07.02.2018, 10:50
    #39597992
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Либо так:

вместо:
Union = db.Set<Union>().AsNoTracking().FirstOrDefault(w => w.DictTypeId != null);

тупо как-то так:
var id = db.Set<Union>().AsNoTracking().FirstOrDefault(w => w.DictTypeId != null)?.DictTypeId
Union = DictType.FirstOrDefault(n => n.Id == id);
...
Рейтинг: 0 / 0
07.02.2018, 10:52
    #39597996
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
NechtoА как делается сопоставление эквивалентности (по Id будет вполне достаточно) ну блин, это ж основы, читай букварь
https://blog.rc21net.ru/csharp-sravnenie-obektov/
...
Рейтинг: 0 / 0
07.02.2018, 10:52
    #39597998
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Petro123,

EntityFramework не имеет никакого отношения к WPF
...
Рейтинг: 0 / 0
07.02.2018, 11:31
    #39598027
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# ef asnotracking и combobox
Roman MejtesPetro123,

EntityFramework не имеет никакого отношения к WPF
Дык тут весь стек от ГУИ к базе.
Давай я от хибера дам коллекцию для комбобокса и что там? Пять строк и покажет?
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / c# ef asnotracking и combobox / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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