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

MVVM postgres

17.06.2020, 10:41. Показов 18163. Ответов 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
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 09:08  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
Это-то тут причём?)
ну тип если у датаконтекста нет строки коннекта то ошибка не ловиться во втором случае
0
Эксперт .NET
 Аватар для Usaga
14727 / 9503 / 1362
Регистрация: 21.01.2016
Сообщений: 35,830
01.04.2021, 09:24
onimor, отсутствие строки подключения можно определить ещё на этапе создания контекста.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 09:37  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
отсутствие строки подключения можно определить ещё на этапе создания контекста
Вообще да. Чет зациклился на этой ошибке. Она в приницпе и не должна появиться.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2021, 10:04
Цитата Сообщение от onimor Посмотреть сообщение
Не знаю, я думал не особо есть разница, что заполнять и возвращать. По крайне мере не видел, что плохо так делать с ObservableCollection.
Как минимум это сбивает с толку, не говоря уже о том, что сама по себе реализация этой коллекции более сложна.
Это НАБЛЮДАЕМАЯ коллекция и, без наблюдения за ней, её применение теряет смысл.
Обычно она создаётся один раз в экземпляре (в поле или свойстве только для чтения) и потом работают с эти единственным экземпляром.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2021, 10:06
Цитата Сообщение от onimor Посмотреть сообщение
Сначала было как у вас сделано. Но не все ошибки ловит в VM.
Должна быть полностью непрерывная цепочка таксков.
Вызываемые таски передают исключение в вызвавший их.
Надо разбираться с первичной проблемой, а не маскировать её.

Пример псевдокода цепочки тасков:
C#
1
2
3
4
5
6
7
8
9
10
11
// Репозиторий
public class Repos
{
    // Синхронный метод. В нём может быть исключение
    private PersonDto GetPerson(int id) => ....;
 
   // Асинхронный метод
   public async Task<PersonDto> GetPersonAsync(int id) 
        => await Task<PersonDto>.Run(()=> GetPerson(id));
   
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Модель
public class Model
{
 
    private Repos repos;
 
   // Асинхронный метод возвращающий список Person по какому-то критерию
  public async Task<IЕnumerable<PersonDto>> GetPersonsAsync(string filter) 
  {
       List<int>  ids = ....; // Получение списка id удовлетворяющего критерию
       
       List<PersonDto> persons = new List<PersonDto>();
       foreach(int id in ids)
           persons.Add(await repos.GetPersonAsync(id));
 
       return persons.AsReadOnly();
   }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ViewModel
public class ViewModel
{
    private Model model;
 
    public ObservableCollection<PersonDto> Persons {get;}
       = new ObservableCollection<PersonDto>();
 
   // Метод команды
   private async void GetPersonsExecute(string filter)
   {
        try
       {
           Persons.Clear();
           foreach(var person in await model.GetPersonsAsync(filter))
             Persons.Add(person);
        }
        catch (Exception ex)
        {
            // Обработка ошибки
        }
   }
}
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 10:21  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пример псевдокода цепочки тасков
Спасибо за пример. Почерпнул из него кое что.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Надо разбираться с первичной проблемой, а не маскировать её.
Ошибку, когда нет строки коннекта он не поймает в любом случае. Но ее и не должно быть в принципе.
0
Эксперт .NET
 Аватар для Usaga
14727 / 9503 / 1362
Регистрация: 21.01.2016
Сообщений: 35,830
01.04.2021, 10:23
Цитата Сообщение от onimor Посмотреть сообщение
Ошибку, когда нет строки коннекта он не поймает в любом случае.
Эта ошибка вылезет в момент создания контекста, а не формирования и материализации запроса.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 10:32  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Эта ошибка вылезет в момент создания контекста, а не формирования и материализации запроса.
у меня при создании контекста нет строки подключения в параметрах. Так как я ее передаю потом из настроек(ее нужно менять в любое время когда меняются настройки).

И если выполнить метод с запросом к базе до передачи, то он крашнется и ошибка не отловится. Но такого не случиться.

Я думаю если в момент создания контекста в параметры пустышку засунуть, то этой ошибки не будет вообще никогда.
0
Эксперт .NET
 Аватар для Usaga
14727 / 9503 / 1362
Регистрация: 21.01.2016
Сообщений: 35,830
01.04.2021, 10:39
Цитата Сообщение от onimor Посмотреть сообщение
у меня при создании контекста нет строки подключения в параметрах. Так как я ее передаю потом из настроек(ее нужно менять в любое время когда меняются настройки).
Иными словами вы создаёте один контекст и удерживаете его на протяжении жизни всего приложения?)

Вообще, так не делается. Строку подключения, как правило, во время работы приложения менять не надо. А если надо, то новую строку тут же нужно в настройках обновить. А контексты создавать или через DI или тогда, когда реально уже нужно в базе сходить.

В любом случае, момент изменения\чтения строки подключения детерминирован и там легко поставить проверку на корректность этой самой строки. Т.е. легко исключить ситуацию, когда мы в контекст пихаем битую строку.
2
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 11:18  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
В любом случае, момент изменения\чтения строки подключения детерминирован и там легко поставить проверку на корректность этой самой строки. Т.е. легко исключить ситуацию, когда мы в контекст пихаем битую строку.
Да с обновлением строки подключения нет проблем. В ошибке пишется, что ее нет вообще. Что и логично я же ее не передал еще. А запрос уже отправил в базу.

Если самому специально так не сделать, то никогда и не будет такой ошибки. Просто для меня странно, что она не ловится.

Цитата Сообщение от Usaga Посмотреть сообщение
А контексты создавать или через DI или тогда, когда реально уже нужно в базе сходить
Вообще контекст мне отдает ServiceProvider, забираю его и использую где нужно.
app
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
        private ServiceProvider serviceProvider;
 
        public App()
        {
            ServiceCollection services = new ServiceCollection();
            ConfigureServices(services);
            serviceProvider = services.BuildServiceProvider();
        }
 
        private void ConfigureServices(ServiceCollection services)
        {
            services.AddDbContext<SQLiteDBContext>(options =>
            {
                options.UseSqlite("Data Source = setting.db");
            });
 
            services.AddDbContext<PostgresDBContext>(options =>
            {
                var builder = new NpgsqlDbContextOptionsBuilder(options);
                builder.SetPostgresVersion(new Version(9, 4));
            });
 
           
        }

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
 public class PostgresDBContext:DbContext
    {
        #region конструктор
        public PostgresDBContext(DbContextOptions<PostgresDBContext> options) : base(options)
        { 
          //пустышку засунуть, чтоб не было ошибки вообще в принципе.
        }
        #endregion
 
        #region Public properties
 
        public DbSet<TableUsers> Users { get; set; }
        public DbSet<TablePosts> Posts { get; set; }
        #endregion
 
        #region Overridden method
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<TableUsers>().HasData(GetSettings());
            modelBuilder.Entity<TablePosts>().HasData(GetPosts());
            base.OnModelCreating(modelBuilder);
        }
        #endregion
 
 
        #region Private method
        private List<TableUsers> GetSettings()
        {
            return new List<TableUsers>
            {
              new TableUsers {Id=1,Login="admin",Password="admin", Name="admin", Rights="admin"}
            };
        }
        private List<TablePosts> GetPosts()
        {
            return new List<TablePosts>
            {
              new TablePosts {Id=1, PostName="Пост №1",User="admin"}
            };
        }
 
       
        #endregion
    }
и где нужно я беру PostgresDBContext и юзаю его
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2021, 12:19
Цитата Сообщение от onimor Посмотреть сообщение
Ошибку, когда нет строки коннекта он не поймает в любом случае. Но ее и не должно быть в принципе.
Различайте ошибки и исключения.
Ошибка - это более общее понятие и она не всегда вызывает исключение.
Что касается именно исключений, то они без проблем передаются через таски.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 12:32  [ТС]
Элд Хасп, "System.InvalidOperationException"
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2021, 12:32
Цитата Сообщение от onimor Посмотреть сообщение
"System.InvalidOperationException"
В какой момент и где исключение возникает?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 13:09  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В какой момент и где исключение возникает?
Как писал выше. При попытке обратиться к базе, когда строка подключения отсутствует.
Это не проблема и такое никогда не произойдет. Просто интересно почему не ловится в месте где возникает.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2021, 16:42
Цитата Сообщение от onimor Посмотреть сообщение
При попытке обратиться к базе, когда строка подключения отсутствует.
На какой из этих строк?
C#
19
20
                var builder = new NpgsqlDbContextOptionsBuilder(options);
                builder.SetPostgresVersion(new Version(9, 4));
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
01.04.2021, 20:24  [ТС]
Элд Хасп, на строке обращения к базе, там где посты загружаются к примеру
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
01.04.2021, 22:33
Цитата Сообщение от onimor Посмотреть сообщение
на строке обращения к базе, там где посты загружаются к примеру
Ну, так исключение возникает и оно не передаётся через таск наверх?
Покажите код метода и всю цепочку его вызовов (стек вызова).
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
02.04.2021, 08:09  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ну, так исключение возникает и оно не передаётся через таск наверх?
Не передается.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Покажите код метода и всю цепочку его вызовов (стек вызова).
контекст
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
 public class PostgresDBContext:DbContext
    {
        #region конструктор
        public PostgresDBContext(DbContextOptions<PostgresDBContext> options) : base(options)
        { 
          //не передаем строку коннекта в options чтоб была ошибка
        }
        #endregion
 
        #region Public properties
 
        public DbSet<TableUsers> Users { get; set; }
        public DbSet<TablePosts> Posts { get; set; }
        #endregion
 
        #region Overridden method
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<TableUsers>().HasData(GetSettings());
            modelBuilder.Entity<TablePosts>().HasData(GetPosts());
            base.OnModelCreating(modelBuilder);
        }
        #endregion
 
 
        #region Private method
        private List<TableUsers> GetSettings()
        {
            return new List<TableUsers>
            {
              new TableUsers {Id=1,Login="admin",Password="admin", Name="admin", Rights="admin"}
            };
        }
        private List<TablePosts> GetPosts()
        {
            return new List<TablePosts>
            {
              new TablePosts {Id=1, PostName="Пост №1",User="admin"}
            };
        }
 
       
        #endregion
    }
модель, в которой происходит екзепшин
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<PostDto>> GetPostsForTheUserAsync()
        {
 
            List<PostDto> posts = new();
 
            //если права админимстратора то возвроащаем все , если нет то только те, которые принадлежат текущему пользователю
            var post = await Task.Run(()=> currentUser.Rights != "admin" ?
                    postgresDBContext.Posts.Where(P => P.User == currentUser.Login).ToList() : postgresDBContext.Posts.ToList());
 
            foreach (var item in post)
            {
                posts.Add(new PostDto
                {
                    Id = item.Id,
                    PostName = item.PostName,
                    User = item.User
                });
            }
 
            return posts.AsReadOnly();
        }
тут
C#
1
2
var post = await Task.Run(()=> currentUser.Rights != "admin" ?
                    postgresDBContext.Posts.Where(P => P.User == currentUser.Login).ToList() : postgresDBContext.Posts.ToList());
vm которая не ловит екзепшин
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        private async void LoadPost()
        {
             try
            {
              
              CollectionOfPosts.Clear();
               //получаем все посты для текущего пользователя
              foreach (var Post in await mainWindowsModel.GetPostsForTheUserAsync())
              CollectionOfPosts.Add(Post);
 
            }
            catch (Exception ex)
            {
                Dialogs.MessageBox(ex.Message);
            }
         }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
02.04.2021, 11:26
Цитата Сообщение от onimor Посмотреть сообщение
тут
DbContext - это "одноразовый" тип.
Создали перед запросом, запросили и после запроса - уничтожили
Если обернуть эти строки в try-catch, что происходит?
Прогоните пошагово (F10, F11):
C#
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            //если права админимстратора то возвроащаем все , если нет то только те, которые принадлежат текущему пользователю
      
           List<TablePosts> post;
 
          try // Вот здесь точка останова и дальше прогоните пошагово
          {
              using(PostgresDBContext postgresDBContext = new PostgresDBContext())
                  post = await Task.Run(()=> currentUser.Rights != "admin" 
                      ? postgresDBContext.Posts.Where(P => P.User == currentUser.Login)
                      : postgresDBContext.Posts)
                      .ToList();
           }
           catch (Exception ex)
          {
               // Попадает ли сюда?
          }
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
02.04.2021, 17:14  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если обернуть эти строки в try-catch, что происходит?
Прогоните пошагово (F10, F11):
Крашится на попытке взять данные "System.InvalidOperationException" и не ловится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2021, 17:14

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru