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

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

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

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



Помогите пожалуйста, кто знает в чем причина?
...
Рейтинг: 0 / 0
c# ef asnotracking и combobox
    #39597210
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,
1) Проверить установлено ли свойство ItemBook при инициализации ViewModel.
2)Если установлено, но все равно не отображается, то вызвать notifyPropertyChange("ItemBook") после установки свойства.
...
Рейтинг: 0 / 0
c# ef asnotracking и combobox
    #39597462
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
c# ef asnotracking и combobox
    #39597533
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что в случае AsNoTracking() Union который ты получил, и Union, который в словаре - это два разных объекта, один отслеживаемый, другой нет.

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

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

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

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



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

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

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

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

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

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

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

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

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

вместо:
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
c# ef asnotracking и combobox
    #39597996
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoА как делается сопоставление эквивалентности (по Id будет вполне достаточно) ну блин, это ж основы, читай букварь
https://blog.rc21net.ru/csharp-sravnenie-obektov/
...
Рейтинг: 0 / 0
c# ef asnotracking и combobox
    #39597998
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

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

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


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