Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/74: Рейтинг темы: голосов - 74, средняя оценка - 4.82
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771

MVVM postgres

17.06.2020, 10:41. Показов 18778. Ответов 200
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
учу mvvm
появилось много вопросов
я создал модель
Кликните здесь для просмотра всего текста

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
public  class GlavTables:INotifyPropertyChanged
    {
        public int id { get; set; }
        private DateTime _dateCreating;
        private string _dateTara;
        private string _dateBrutto;
        private string _dateRegistration;
        private double _tara;
        private double _brutto;
        private double _netto;
        private string _typeScales;
        private string _transportNumber;
        private string _driver;
        private string _trailer;
        private string _post;
        private string _product;
        private string _sender;
        private string _payer;
        private string _consignee;
        private string _user;
        private bool _chakRegistration;
        private bool _chakBlok;
        
        public  DateTime dateCreating
        {
            get { return _dateCreating; }
            set
            {
                if (_dateCreating == value)
                    return;
 
                _dateCreating = value;
                OnPropertyChanget("dateCreating");
 
            }
        }
        public string dateTara
        {
            get {return _dateTara; }
            set
            {
                if (_dateTara == value)
                    return;
 
                _dateTara = value;
                OnPropertyChanget("dateTara");
 
            }
        }
        public string dateBrutto
        {
            get { return _dateBrutto; }
            set
            {
                if (_dateBrutto == value)
                    return;
 
                _dateBrutto = value;
                OnPropertyChanget("dateBrutto");
 
            }
        }
        public string dateRegistration
        {
            get { return _dateRegistration; }
            set
            {
                if (_dateRegistration == value)
                    return;
 
                _dateRegistration = value;
                OnPropertyChanget("dateRegistration");
 
            }
        }
        public double tara
        {
            get { return _tara; }
            set
            {
                if (_tara == value)
                    return;
 
                _tara = value;
                OnPropertyChanget("tara");
 
            }
        }
        public double brutto
        {
            get { return _brutto; }
            set
            {
                if (_brutto == value)
                    return;
 
                _brutto = value;
                OnPropertyChanget("brutto");
 
            }
        }
        public double netto
        {
            get { return _netto; }
            set
            {
                if (_netto == value)
                    return;
 
                _netto = value;
                OnPropertyChanget("netto");
 
            }
        }
        public string typeScales
        {
            get { return _typeScales; }
            set
            {
                if (_typeScales == value)
                    return;
 
                _typeScales = value;
                OnPropertyChanget("typeScales");
 
            }
        }
        public string transportNumber
        {
            get { return _transportNumber; }
            set
            {
                if (_transportNumber == value)
                    return;
 
                _transportNumber = value;
                OnPropertyChanget("transportNumber");
 
            }
        }
        public string driver
        {
            get { return _driver; }
            set
            {
                if (_driver == value)
                    return;
 
                _driver = value;
                OnPropertyChanget("driver");
 
            }
        }
        public string trailer
        {
            get { return _trailer; }
            set
            {
                if (_trailer == value)
                    return;
 
                _trailer = value;
                OnPropertyChanget("trailer");
 
            }
        }
        public string post
        {
            get { return _post; }
            set
            {
                if (_post == value)
                    return;
 
                _post = value;
                OnPropertyChanget("post");
 
            }
        }
        public string product
        {
            get { return _product; }
            set
            {
                if (_product == value)
                    return;
 
                _product = value;
                OnPropertyChanget("product");
 
            }
        }
        public string sender
        {
            get { return _sender; }
            set
            {
                if (_sender == value)
                    return;
 
                _sender = value;
                OnPropertyChanget("sender");
 
            }
        }
        public string payer
        {
            get { return _payer; }
            set
            {
                if (_payer == value)
                    return;
 
                _payer = value;
                OnPropertyChanget("payer");
 
            }
        }
        public string consignee
        {
            get { return _consignee; }
            set
            {
                if (_consignee == value)
                    return;
 
                _consignee = value;
                OnPropertyChanget("consignee");
 
            }
        }
        public string user
        {
            get { return _user; }
            set
            {
                if (_user == value)
                    return;
 
                _user = value;
                OnPropertyChanget("user");
 
            }
        }
        public bool chakRegistration
        {
            get { return _chakRegistration; }
            set
            {
                if (_chakRegistration == value)
                    return;
 
                _chakRegistration = value;
                OnPropertyChanget("chakRegistration");
 
            }
        }
        public bool chakBlok
        {
            get { return _chakBlok; }
            set
            {
                if (_chakBlok == value)
                    return;
 
                _chakBlok = value;
                OnPropertyChanget("chakBlok");
 
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanget(string propertyName="")
        {
           
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

создал сервис , который должен заполнять данными я это сделал так
Кликните здесь для просмотра всего текста

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
 public BindingList<GlavTables> LoadData()
        {
            try
            {
                string conn = "Server=192.168.1.111;Port=5432;User Id=postgres;Password=123;Database=postgres111";
                DataSet ds = new DataSet();
                DataTable dt = new DataTable();
                string sql = " SELECT * FROM \"glav\" ";
                NpgsqlConnection ConnLocal = new NpgsqlConnection(conn);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, ConnLocal);
                da.Fill(ds);
                BindingList<GlavTables> glavTavles = new BindingList<GlavTables>();
                for (int i=0; ds.Tables[0].Rows.Count > i;i++)
                {
                    glavTavles.Add(new GlavTables
                {
                    
                    id = Convert.ToInt32(ds.Tables[0].Rows[i][0].ToString()),
                    dateCreating = Convert.ToDateTime(ds.Tables[0].Rows[i][2].ToString()),
                    dateTara = ds.Tables[0].Rows[i][3].ToString(),
                    dateBrutto = ds.Tables[0].Rows[i][4].ToString(),
                    dateRegistration = ds.Tables[0].Rows[i][5].ToString(),
                    tara = nullNo(ds.Tables[0].Rows[i][6].ToString()),
                    brutto = nullNo(ds.Tables[0].Rows[i][7].ToString()),
                    netto = nullNo(ds.Tables[0].Rows[i][8].ToString()),
                    typeScales = ds.Tables[0].Rows[i][11].ToString(),
                    transportNumber = ds.Tables[0].Rows[i][12].ToString(),
                    driver = ds.Tables[0].Rows[i][13].ToString(),
                    trailer = ds.Tables[0].Rows[i][14].ToString(),
                    post = "Пост1",
                    product = ds.Tables[0].Rows[i][16].ToString(),
                    sender = ds.Tables[0].Rows[i][17].ToString(),
                    payer = ds.Tables[0].Rows[i][18].ToString(),
                    consignee = ds.Tables[0].Rows[i][19].ToString(),
                    user = ds.Tables[0].Rows[i][20].ToString(),
                    chakRegistration = true,
                    chakBlok = false
                
                });
                }
                return glavTavles;
            }
            catch
            {  return null; }
        }

после чего в основном классе
Кликните здесь для просмотра всего текста

C#
1
2
3
 GlavTablesIOServices glavTablesIOServices = new GlavTablesIOServices();
            _glavTables = glavTablesIOServices.LoadData();
            dg_glavGrid.ItemsSource = _glavTables;

и тут первый вопрос. можно это сделать без циклов ? например сразу конвертировать в BindingList и как вообще правильно заполнять данными из бд?

дальше я показываю таблицу в view
Кликните здесь для просмотра всего текста

XML
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
 <DataGrid 
 
                x:Name="dg_glavGrid" AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path=id}" IsReadOnly="True" Header="№"/>
                    <DataGridTextColumn Binding="{Binding Path=dateCreating}" IsReadOnly="True" Header="Дата создания"/>
                    <DataGridTextColumn Binding="{Binding Path=dateTara}" IsReadOnly="True" Header="Дата тара"/>
                    <DataGridTextColumn Binding="{Binding Path=dateBrutto}" IsReadOnly="True" Header="Дата брутто"/>
                    <DataGridTextColumn Binding="{Binding Path=dateRegistration}" IsReadOnly="True" Header="Дата оформления"/>
                    <DataGridTextColumn Binding="{Binding Path=tara}" IsReadOnly="True" Header="Тара"/>
                    <DataGridTextColumn Binding="{Binding Path=brutto}" IsReadOnly="True" Header="Брутто"/>
                    <DataGridTextColumn Binding="{Binding Path=netto}" IsReadOnly="True" Header="Нетто"/>
                    <DataGridTextColumn Binding="{Binding Path=typeScales}" IsReadOnly="True" Header="Тип весов"/>
                    <DataGridTextColumn Binding="{Binding Path=transportNumber}" IsReadOnly="True" Header="Т/С"/>
                    <DataGridTextColumn Binding="{Binding Path=driver}" IsReadOnly="True" Header="Водитель"/>
                    <DataGridTextColumn Binding="{Binding Path=trailer}" IsReadOnly="True" Header="Прицеп"/>
                    <DataGridTextColumn Binding="{Binding Path=post}" IsReadOnly="True" Header="Имя поста"/>
                    <DataGridTextColumn Binding="{Binding Path=product}" IsReadOnly="True" Header="Товар"/>
                    <DataGridTextColumn Binding="{Binding Path=sender}" IsReadOnly="True" Header="Отправитель"/>
                    <DataGridTextColumn Binding="{Binding Path=payer}" IsReadOnly="True" Header="Плательщик"/>
                    <DataGridTextColumn Binding="{Binding Path=consignee}" IsReadOnly="True" Header="Получатель"/>
                    <DataGridTextColumn Binding="{Binding Path=user}" IsReadOnly="True" Header="Пользователь"/>
                    <DataGridCheckBoxColumn Binding="{Binding Path=chakRegistration, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" Header="Оформление"/>
                    <DataGridCheckBoxColumn Binding="{Binding Path=chakBlok, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" Header="Доступность"/>
                </DataGrid.Columns>
            </DataGrid>
 
        </Grid>
 
    </Grid>

и снова вопрос. мне нужно добавлять данные в BindingList и при событии добавления/удаления/изменения делать изменения в бд? Или просто делать запросы в бд update/insert и после этого заново заполнять данными? второе звучит проще и логичней для меня.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.06.2020, 10:41
Ответы с готовыми решениями:

Mvvm
Форумчане помогите разобраться есть простенькая модель public partial class Category:ViewModelBase { private int...

x:Name в MVVM
Добрый день, как обращаться к объектам из VM по их x:Name? Например, у меня есть канвас в который я докидываю картинки по нажатию...

MVVM
Здравствуйте, я в среде WPF нахожусь очень мало, посмотрел книжки, решил читать Мэтью Макдональда, стоит ли мне сразу изучать MVVM или...

200
Эксперт .NET
 Аватар для Usaga
14809 / 9582 / 1368
Регистрация: 21.01.2016
Сообщений: 36,093
30.03.2021, 06:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от onimor Посмотреть сообщение
в итоге словарь лучше делать или класс?
Класс. В чём прикол со словарём?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
30.03.2021, 08:29  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
В чём прикол со словарём?
Не знаю. Сказали, что часто его используют для настроек.
0
Эксперт .NET
 Аватар для Usaga
14809 / 9582 / 1368
Регистрация: 21.01.2016
Сообщений: 36,093
30.03.2021, 08:30
onimor, никто его не использует для настроек.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
30.03.2021, 08:40  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
никто его не использует для настроек.
Хорошо спасибо.

Последний вопрос :
Допустим вот он класс
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
public class Settings
    {
        public bool RememberUser { get; set; }
 
        public bool NumberOfPosts { get; set; }
 
        public bool NumberRecognition { get; set; }
 
        public string LocalIp { get; set; }
        public string LocalPort { get; set; }
        public string LocalDBName { get; set; }
        public string LocalLog { get; set; }
        public string LocalPass { get; set; }
        public bool Online { get; set; }
        public string OnlineLog { get; set; }
        public string OnlinePass { get; set; }
 
 
        public string TCPIp { get; set; }
        public int TCPPort { get; set; }
        public bool UPnP { get; set; }
 
        public string ModbusIp { get; set; }
        public int ModbusPort { get; set; }
 
 
    }
мне его тупо передавать куда нужно или делать функции, чтоб возвращать настройки
0
Эксперт .NET
 Аватар для Usaga
14809 / 9582 / 1368
Регистрация: 21.01.2016
Сообщений: 36,093
30.03.2021, 08:47
Цитата Сообщение от onimor Посмотреть сообщение
мне его тупо передавать куда нужно или делать функции, чтоб возвращать настройки
Я не понял вопроса.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
30.03.2021, 08:50  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Я не понял вопроса.
этот класс мне просто передавать в другие классы где он нужен и напрямую использовать свойства или правильней делать методы чтоб его использовать
0
Эксперт .NET
 Аватар для Usaga
14809 / 9582 / 1368
Регистрация: 21.01.2016
Сообщений: 36,093
30.03.2021, 08:56
Цитата Сообщение от onimor Посмотреть сообщение
этот класс мне просто передавать в другие классы где он нужен и напрямую использовать свойства
Да.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
30.03.2021, 11:58
Цитата Сообщение от onimor Посмотреть сообщение
в итоге словарь лучше делать или класс?
Оба варианта применяются.
Тот же Properties.Settings совмещает в себе одновременно оба варианта.
В основе его словарь, но каждый ключ обёрнут в ещё и в свойство.
Значение можно получить как по имени настройки в словаре, так и через одноимённое свойство.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
31.03.2021, 18:21  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Конечно
вроде переделал , посмотрите? ветка Dev
Помимо всего меня смущает вынужденная проверка на ошибки, когда другой поток может крашнуться при работе с бд ведь надо обработать и сообщить пользователю ошибку, из-за чего метод возвращающий коллекцию или bool начинает возвращать Task<object> в котором либо ошибка, либо нужные данные. как по другому сделать не придумал. в MainWindowsModel это происходит. Из-за этого VM становиться еще более велосипедный какой-то..
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
31.03.2021, 18:29
Цитата Сообщение от onimor Посмотреть сообщение
Task<object> в котором либо ошибка, либо нужные данные. как по другому сделать не придумал. в MainWindowsModel это происходит. Из-за этого VM становиться еще более велосипедный какой-то..
Ну, с асинхронными методами всегда так.
Самый верхний метод void (например Execute команды).
И в нём нужна обработка ошибок.
Устанавливается какое-то свойство и/или посылается сообщение о ошибке.

А где ещё их обрабатывать?

Добавлено через 36 секунд
Цитата Сообщение от onimor Посмотреть сообщение
вроде переделал , посмотрите? ветка Dev
Сегодня вряд ли получится.
Если не забуду, посмотрю завтра.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
31.03.2021, 19:12  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Самый верхний метод void (например Execute команды).
И в нём нужна обработка ошибок.
я и хотел в верхнем в VM, но он крашится в другом потоке в Model и не ловится в VM

Добавлено через 24 секунды
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сегодня вряд ли получится.
Если не забуду, посмотрю завтра.
Хорошо, спасибо

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
и/или посылается сообщение о ошибке.
событие сделать и на него подписаться в VM ? передавать в событии ошибку. тогда не нужно будет ее возвращать.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
31.03.2021, 19:26
Цитата Сообщение от onimor Посмотреть сообщение
я и хотел в верхнем в VM, но он крашится в другом потоке в Model и не ловится в VM
Значит где-то прервана цепочка тасков.
Он должна быть непрерывной до верхнего уровня в VM, в View или в App.

Добавлено через 5 минут
Цитата Сообщение от onimor Посмотреть сообщение
событие сделать и на него подписаться в VM ? передавать в событии ошибку. тогда не нужно будет ее возвращать.
Нет.
До VM должны подыматься таски.
А вот в VM, если поймана ошибка можно создать событие.
Событие "ловит" App и там уже создаёт Окно с сообщением об ошибке.
Это типовая схема.

Но есть множество и других.
В том числе можно для ошибок создать свой канал или шину сообщений.
На него подписывается App или View.
А посылать сообщения об ошибке может любой объект.

Пример простого Мессенджера можете посмотреть здесь 3. Шины Сообщений.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
31.03.2021, 20:21  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Значит где-то прервана цепочка тасков
не понял какая цепочка тасков. может по этому такое и происходит, похоже пробел в знаниях.
к примеру если выполнить этот метод
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
 public async Task<object> GetPostsForTheUser()
        {
            try
            {
                ObservableCollection<Posts> posts = new();
 
                //если права администратора то возвращаем все , если нет то только те, которые принадлежат текущему пользователю
                var post = await Task.Run(() => settings.CurrentUserRights == "admin" ?
                    postgresDBContext.Posts.Where(P => P.User == settings.CurrentUserLogin).ToList() : postgresDBContext.Posts.ToList());
 
                foreach (var item in post)
                {
                    posts.Add(new Posts
                    {
                        Id = item.Id,
                        PostName = item.PostName,
                        User = item.User
                    });
                }
 
                return posts;
            }
            catch(Exception ex)
            {
                return ex.Message;
            }
           
        }
тут var post = await Task.Run(()=> ЧтоНибудь());
на сколько понимаю я отслеживаю, что нет ошибок при запуске потока, а то что уже внутри- основной поток не видит.
По этому ошибка не ловиться. и нужно ловить ее уже внутри
C#
1
2
3
4
5
6
7
8
9
10
var post = await Task.Run(()=>{
try
{ 
ЧтоНибудь();
}
catch(Exception e)
{
EventError?.Invoce(e.Message);
}
});
типо того?

Добавлено через 3 минуты
или как-то нужно по другому делать асинхронные запросы к базе?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
31.03.2021, 21:23
onimor, вы чуток хоть прочитайте за асинхронные методы.
И с какого перепуга вы в потоке открываете ObservableCollection ?
Это же азы Шарпа не имеющие отношения к WPF.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        public async Task<IReadOnlyList<Posts>> GetPostsForTheUserAsync()
        {
                List<Posts> posts = new();
 
                //если права администратора то возвращаем все , если нет то только те, которые принадлежат текущему пользователю
                var post = await Task.Run(() => settings.CurrentUserRights == "admin" ?
                    postgresDBContext.Posts.Where(P => P.User == settings.CurrentUserLogin).ToList() : postgresDBContext.Posts.ToList());
 
                foreach (var item in post)
                {
                    posts.Add(new Posts
                    {
                        Id = item.Id,
                        PostName = item.PostName,
                        User = item.User
                    });
                }
 
                return posts.AsReadOnly();
          
        }
Метод верхнего уровня в VM:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public ObservableCollection<Posts> Posts {get;} = new ObservableCollection<Posts>();
private async void MainMethod()
{
     try
     {
          var posts = await model.GetPostsForTheUserAsync();
          Posts.Clear();
          foreasch(var post in posts)
             Posts.Add(post); 
     }
     catch (Exception ex)
     {
         // Здесь обработка ошибки
     }
}
Добавлено через 2 минуты
И очень не удачно назвали тип Posts.
Это же ОДИН пост, а не множество.
Название должно быть или Post (один пост), или PostsItem (элемент коллекции постов).

Добавлено через 37 секунд
Для уровня Модели лучше подходит Post.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 07:05  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вы чуток хоть прочитайте за асинхронные методы
Читал...
Сначала было как у вас сделано. Но не все ошибки ловит в VM.
После чего начались велосипеды с попытками поймать в model, то что вы видели выше, но и там не ловиться.
Если не передать строку коннекта в DB контекст и выполнить метод, то ошибка не ловиться к примеру.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
И с какого перепуга вы в потоке открываете ObservableCollection
Не знаю, я думал не особо есть разница, что заполнять и возвращать. По крайне мере не видел, что плохо так делать с ObservableCollection.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это же ОДИН пост, а не множество.
их много может быть, но я понял о чем вы
0
Эксперт .NET
 Аватар для Usaga
14809 / 9582 / 1368
Регистрация: 21.01.2016
Сообщений: 36,093
01.04.2021, 07:39
Цитата Сообщение от onimor Посмотреть сообщение
var post = await Task.Run(() => settings.CurrentUserRights == "admin" ?
postgresDBContext.Posts.Where(P => P.User == settings.CurrentUserLogin).ToList() : postgresDBContext.Posts.ToList());
А чего это вдруг роль пользователя в настройках хранится-то?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 08:42  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
А чего это вдруг роль пользователя в настройках хранится-то?
пока для теста, времени мало было. потом будет по другому

Добавлено через 7 минут
там и
C#
1
settings.CurrentUserRights == "admin"
не правильно, должно быть
C#
1
settings.CurrentUserRights != "admin"
Добавлено через 27 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вы чуток хоть прочитайте за асинхронные методы
модель
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public async Task<bool> UserVerificationAsync(string login,string pass)
        {
 
            var user = await Task.Run(() => postgresDBContext.Users.FirstOrDefault(U => U.Login == login));
 
            if (user == null)
                throw new Exception("Не верный логин!");
 
            if (user.Password != pass)
                throw new Exception("Не верный пароль!");
 
            return true;
 
        }
VM
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private async void Entry()
        {
            try
            {
                var result = await mainWindowsModel.UserVerificationAsync(EntryUserLogin, EntryUserPassword);
            }
            catch (Exception ex)
            {
 
            }
           
        }
тоже не ловит ошибку если не правильный ip, port или прочее

Добавлено через 10 минут
можно конечно, к примеру, делать проверку постоянно перед запросом к базе
C#
1
2
3
4
            if(!await postgresDBContext.Database.CanConnectAsync())
            {
                throw new Exception("Не удалось подключиться к базе! Проверте настройки и повторите попытку");
            }
но нас сколько это рационально
0
Эксперт .NET
 Аватар для Usaga
14809 / 9582 / 1368
Регистрация: 21.01.2016
Сообщений: 36,093
01.04.2021, 08:46
onimor,

C#
1
var user = await Task.Run(() => postgresDBContext.Users.FirstOrDefault(U => U.Login == login));
=>

C#
1
var user = await postgresDBContext.Users.FirstOrDefaultAsync(U => U.Login == login));
Добавлено через 40 секунд
Цитата Сообщение от onimor Посмотреть сообщение
можно конечно, к примеру, делать проверку постоянно перед запросом к базе
Бред же)
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 08:58  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
FirstOrDefaultAsync
я так пробовал, но не находил такой метод.
щас заметил что нет
C#
1
using Microsoft.EntityFrameworkCore;
Добавлено через 41 секунду
Цитата Сообщение от Usaga Посмотреть сообщение
Бред же)
да, согласен

Добавлено через 9 минут
И кстати теперь ошибка нормально ловиться , когда вызывается метод, но в датаконтекст не передаеться строка коннекта.
В отлии от
C#
1
2
 var post = await Task.Run(() => settings.CurrentUserRights == "admin" ?
                    postgresDBContext.Posts.Where(P => P.User == settings.CurrentUserLogin).ToList() : postgresDBContext.Posts.ToList());
0
Эксперт .NET
 Аватар для Usaga
14809 / 9582 / 1368
Регистрация: 21.01.2016
Сообщений: 36,093
01.04.2021, 09:02
Цитата Сообщение от onimor Посмотреть сообщение
но в датаконтекст не передаеться строка коннекта.
Это-то тут причём?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.04.2021, 09:02

MVVM
Добрый день! Пытаюсь написать программу в стиле MVVM. Вопрос такой: как передать SelectedItem TreeView из xaml с помощью Binding в...

Model в MVVM
Доброго времени суток. Начал изучать MVVM и даже что-то получается сделать, но не могу сообразить, что должно быть в Model? Программа...

Mvvm datagrid ef
Здравствуйте форумчане, у меня такая проблема есть приложение При выделении datagrid биндю Selecteditem в textboxы мои ...

WPF MVVM
Привет всем! Изучаю патерн MVVM. Не могу понять как реализовать ее, если допустим мне необходимо одно и тоже окно использовать для разных ...

MVVM патерн
Всем привет. Уже писал по поводу данного стиля программирования, более менее разобрался, но некоторые вещи не понятны. Допустим у меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru