Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Perdywok
0 / 0 / 1
Регистрация: 16.05.2015
Сообщений: 67
1

MVVM и Entity Framework

03.07.2017, 01:26. Просмотров 3728. Ответов 4
Метки нет (Все метки)

Всем привет.Столкнулся с проблемой в том что не сохраняет изменения в базе данных(в таблице Books).Как надо изменить ViewModel что бы корректно сохранялись данные в бд?Может можно как нибудь привязать коллекцию книг из контекста к ObservableCollection<Book> Books в BookViewModel?Что бы при изменении ObservableCollection<Book> Books изменялась и соответствующая таблица(Book) в бд?


class Book
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 partial class Book
    {
        public int id { get; set; }
 
        [StringLength(50)]
        public string Name { get; set; }
 
        [StringLength(50)]
        public string Autor { get; set; }
 
        [StringLength(50)]
        public string Cover { get; set; }
 
        [StringLength(50)]
        public string Genge { get; set; }
 
        [StringLength(50)]
        public string Publisher { get; set; }
 
        [StringLength(50)]
        public string Language { get; set; }
 
        public int? Price { get; set; }
 
        public int? Pages { get; set; }
 
        public int? Year { get; set; }
    }
class BookContext
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public partial class BooksContext : DbContext
    {
        public BooksContext()
            : base("name=BooksContext")
        {
        }
 
        public virtual DbSet<Book> Books { get; set; }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }
    }
class BookViewModel
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
class BookViewModel : INotifyPropertyChanged
    {
        
        private Book selectedBook { get; set; }
        public ObservableCollection<Book> Books { get; set; }
 
 
#region Commands
        // команда добавления нового объекта
        private RelayCommand addCommand;
        public RelayCommand AddCommand
        {
            get
            {
                return addCommand ??
                  (addCommand = new RelayCommand(obj =>
                  {
                      Book book = new Book();
                      book.Name = "New Book";
                      Books.Insert(0, book);
                      
                      selectedBook = book;
                  using (BooksContext context = new BooksContext())
                      {
                          context.Books.Add(SelectedBook);
                      }
                  }));
            }
        }
 
        // команда удаления
        private RelayCommand removeCommand;
        public RelayCommand RemoveCommand
        {
            get
            {
                return removeCommand ??
                  (removeCommand = new RelayCommand(obj =>
                  {
                      Book book = obj as Book;
                      if (book != null)
                      {
                          Books.Remove(book);
                      }
                  },
                 (obj) => Books.Count > 0));
            }
        }
 
        #endregion
        #region Properties
        public int Id
        {
            get
            {
                return SelectedBook.id;
            }
            set
            {
                SelectedBook.id = value;
                OnPropertyChanged("Id");
            }      
        }
        public string Name
        {
            get
            {
                return SelectedBook.Name;
            }
            set
            {
                SelectedBook.Name = value;
                OnPropertyChanged("Name");
            }
        }
        public string Autor
        {
            get
            {
                return SelectedBook.Autor;
            }
            set
            {
                SelectedBook.Autor = value;
                OnPropertyChanged("Autor");
            }
        }
        public string Cover
        {
            get
            {
                return SelectedBook.Cover;
            }
            set
            {
                SelectedBook.Cover = value;
                OnPropertyChanged("Cover");
            }
        }
        public string Genge
        {
            get
            {
                return SelectedBook.Genge;
            }
            set
            {
                SelectedBook.Genge = value;
                OnPropertyChanged("Genge");
            }
        }
        public string Publisher
        {
            get
            {
                return SelectedBook.Publisher;
            }
            set
            {
                SelectedBook.Publisher = value;
                OnPropertyChanged("Publisher");
            }
        }
        public string Language
        {
            get
            {
                return SelectedBook.Language;
            }
            set
            {
                SelectedBook.Language = value;
                OnPropertyChanged("Language");
            }
        }
        public int? Price
        {
            get
            {
                return SelectedBook.Price;
            }
            set
            {
                SelectedBook.Price = value;
                OnPropertyChanged("Price");
            }
        }
        public int? Pages
        {
            get
            {
                return SelectedBook.Pages;
            }
            set
            {
                SelectedBook.Pages = value;
                OnPropertyChanged("Pages");
            }
        }
        public int? Year
        {
            get
            {
                return SelectedBook.Year;
            }
            set
            {
                SelectedBook.Year = value;
                OnPropertyChanged("Year");
            }
        }
        #endregion
        public Book SelectedBook
        {
            get { return selectedBook; }
            set
            {
                selectedBook = value;
                OnPropertyChanged("SelectedBook");
            }
        }
 
        public BookViewModel()
        {
            Books = new ObservableCollection<Book>();
            //может надо сделать что то типа такого ?
            /*
            using (BooksContext context = new BooksContext())
            {
                Books = context.Books.ToList();
            }
            */
        }
 
 
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
MainWindow.xaml
HTML5
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
<Window x:Class="Library.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Library"
        mc:Ignorable="d"
        Title="Library" Height="489.216" Width="525">
    <Window.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="FontSize" Value="14" />
        </Style>
        <Style TargetType="TextBox">
            <Setter Property="FontSize" Value="14" />
        </Style>
        <Style TargetType="Button">
            <Setter Property="Width" Value="40" />
            <Setter Property="Margin" Value="5" />
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="0.8*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="0.2*" />
        </Grid.RowDefinitions>
        <ListBox Grid.Column="0" ItemsSource="{Binding Books}"
                 SelectedItem="{Binding SelectedBook}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="5">
                        <TextBlock FontSize="18" Text="{Binding Path=Name}" />
                        <TextBlock Text="{Binding Path=Autor}" />
                        <TextBlock Text="{Binding Path=Price}" />
                        <TextBlock Text="{Binding Path=Pages}" />
                        <TextBlock Text="{Binding Path=Cover}" />
                        <TextBlock Text="{Binding Path=Genge}" />
                        <TextBlock Text="{Binding Path=Year}" />
                        <TextBlock Text="{Binding Path=Publisher}" />
                        <TextBlock Text="{Binding Path=Language}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <StackPanel Grid.Row="1" Orientation="Horizontal">
            <Button Command="{Binding AddCommand}">+</Button>
            <Button Command="{Binding RemoveCommand}"
                    CommandParameter="{Binding SelectedBook}">-</Button>
        </StackPanel>
 
        <StackPanel Grid.Column="1" DataContext="{Binding SelectedBook}">
            <TextBlock Text="Selected book"  />
            <TextBlock Text="Name" />
            <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock Text="Autor" />
            <TextBox Text="{Binding Autor, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock Text="Price" />
            <TextBox Text="{Binding Price, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock Text="Pages" />
            <TextBox Text="{Binding Pages, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock Text="Cover" />
            <TextBox Text="{Binding Cover, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock Text="Genge" />
            <TextBox Text="{Binding Genge, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock Text="Year" />
            <TextBox Text="{Binding Year, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock Text="Publisher" />
            <TextBox Text="{Binding Publisher, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock Text="Language" />
            <TextBox Text="{Binding Language, UpdateSourceTrigger=PropertyChanged}" />
        </StackPanel>
    </Grid>
</Window>
Добавлено через 5 часов 9 минут
Проблема все еще актуальна)Может у кого есть есть похожий код или ссылка на подобное решение?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2017, 01:26
Ответы с готовыми решениями:

Использование MVVM + Entity Framework
Добрый вечер! Хотел бы понять как работать по паттерну MVVM в связке с entity, есть некая проблема...

Entity Framework и ObservableCollection
хочу понять как правильно использовать энтити модель для управления данными (сохранения,...

Entity Framework и WPF
Доброго вечера, форумчане! Вопрос где можно почитать (на русском языке) про работу с Entity...

Взаимосвязь Entity Framework и XAML
Доброго вечера. Столкнулся с очередной трудностью, которую не могу решить перечитывая разные...

Entity Framework и сортировка в DataGrid
Добрий день. Для соединения с DataGrid использываю Entity Framework, и передаю в ItemSourse свою...

4
Gekr
42 / 43 / 31
Регистрация: 01.10.2012
Сообщений: 185
Завершенные тесты: 1
03.07.2017, 11:56 2
Лучший ответ Сообщение было отмечено Perdywok как решение

Решение

Какого рода изменения? У тебя реализовано только добавление в базу данных новой записи и у тебя отсутствует вызов метода для сохранения состояния источника данных context.SaveChanges(). Для обновления объекта в базе данных следует добавить кнопку Update, в которой вызывать:

C#
1
2
3
4
5
using (BooksContext context = new BooksContext())
                      {
                          context.Entry(SelectedBook).State = System.Data.Entity.EntityState.Modified;
                          context.SaveChanges();
                      }
И да, для выгрузки данных из БД для дальнейшего их отображения, в конструкторе следует вызывать context.Books.ToList() и выгружать полученные данные в ObservableCollection.
1
Perdywok
0 / 0 / 1
Регистрация: 16.05.2015
Сообщений: 67
03.07.2017, 12:02  [ТС] 3
все что ты сказал уже сделал,кроме кнопки апдейта. Сейчас попробую)

Добавлено через 4 минуты
В этом месте ругается
context.Books.SaveChanges(SelectedBook);

Error CS1061 'DbSet<Book>' does not contain a definition for 'SaveChanges' and no extension method 'SaveChanges' accepting a first argument of type 'DbSet<Book>' could be found
0
Gekr
42 / 43 / 31
Регистрация: 01.10.2012
Сообщений: 185
Завершенные тесты: 1
03.07.2017, 12:41 4
Я поправил код в сообщение выше

C++
1
context.SaveChanges();
0
Perdywok
0 / 0 / 1
Регистрация: 16.05.2015
Сообщений: 67
03.07.2017, 18:01  [ТС] 5
Да,я увидел,сижу пока разбираюсь как нормально этот метод к команде прикрутить. Плохо пока разбираюсь как правильно писать команды)

Добавлено через 3 часа 28 минут
спасибо за хелп,все работает)

Добавлено через 3 минуты
для тех кого это тоже будет интересовать:
прекрасно работает и без кнопки апдейта(после изменения комманд добавления и удаления).
так изменил класс BookViewModel:
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
class BookViewModel : INotifyPropertyChanged
    {
 
        private Book selectedBook { get; set; }
        public ObservableCollection<Book> Books { get; set; }
 
 
        #region Commands
        // команда добавления нового объекта
        private RelayCommand addCommand;
        public RelayCommand AddCommand
        {
            get
            {
                return addCommand ??
                  (addCommand = new RelayCommand(obj =>
                  {
                      Book book = new Book();
                      book.Name = "New Book";
                      Books.Insert(0, book);
 
                      selectedBook = book;
                      using (BooksContext context = new BooksContext())
                      {
                          context.Books.Add(SelectedBook);
                          context.SaveChanges();
                      }
                  }));
            }
        }
 
        // команда удаления
        private RelayCommand removeCommand;
        public RelayCommand RemoveCommand
        {
            get
            {
                return removeCommand ??
                  (removeCommand = new RelayCommand(obj =>
                  {
                      Book book = obj as Book;
                      if (book != null)
                      {
                          using (BooksContext context = new BooksContext())
                          {
                              List<Book> temp = context.Books.ToList();
                              var selecteditem = from t in context.Books
                                                 where book.id == t.id
                                                 select t;
                              context.Books.Remove(selecteditem.FirstOrDefault());
 
 
                              context.SaveChanges();
                          }
                          Books.Remove(book);
 
                      }
                  },
                 (obj) => Books.Count > 0));
            }
        }
 
        #endregion
        #region Properties
        public int Id
        {
            get
            {
                return SelectedBook.id;
            }
            set
            {
                SelectedBook.id = value;
                OnPropertyChanged("Id");
            }
        }
        public string Name
        {
            get
            {
                return SelectedBook.Name;
            }
            set
            {
                SelectedBook.Name = value;
                OnPropertyChanged("Name");
            }
        }
        public string Autor
        {
            get
            {
                return SelectedBook.Autor;
            }
            set
            {
                SelectedBook.Autor = value;
                OnPropertyChanged("Autor");
            }
        }
        public string Cover
        {
            get
            {
                return SelectedBook.Cover;
            }
            set
            {
                SelectedBook.Cover = value;
                OnPropertyChanged("Cover");
            }
        }
        public string Genge
        {
            get
            {
                return SelectedBook.Genge;
            }
            set
            {
                SelectedBook.Genge = value;
                OnPropertyChanged("Genge");
            }
        }
        public string Publisher
        {
            get
            {
                return SelectedBook.Publisher;
            }
            set
            {
                SelectedBook.Publisher = value;
                OnPropertyChanged("Publisher");
            }
        }
        public string Language
        {
            get
            {
                return SelectedBook.Language;
            }
            set
            {
                SelectedBook.Language = value;
                OnPropertyChanged("Language");
            }
        }
        public int? Price
        {
            get
            {
                return SelectedBook.Price;
            }
            set
            {
                SelectedBook.Price = value;
                OnPropertyChanged("Price");
            }
        }
        public int? Pages
        {
            get
            {
                return SelectedBook.Pages;
            }
            set
            {
                SelectedBook.Pages = value;
                OnPropertyChanged("Pages");
            }
        }
        public int? Year
        {
            get
            {
                return SelectedBook.Year;
            }
            set
            {
                SelectedBook.Year = value;
                OnPropertyChanged("Year");
            }
        }
        #endregion
        public Book SelectedBook
        {
            get { return selectedBook; }
            set
            {
                selectedBook = value;
                OnPropertyChanged("SelectedBook");
            }
        }
 
        public BookViewModel()
        {
            Books = new ObservableCollection<Book>();
            using (BooksContext context = new BooksContext())
            {
                List<Book> temp = context.Books.ToList();
                foreach (var item in temp)
                {
                    Books.Add(item);
                }
            }
        }
 
        public void Update()
        {
            using (BooksContext context = new BooksContext())
            {
                context.Entry(SelectedBook).State = System.Data.Entity.EntityState.Modified;
                context.SaveChanges();
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
0
03.07.2017, 18:01
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2017, 18:01

Entity Framework 6 и отображение картинок BitmapImage
Здравствуйте ! Только начал изучать EF 6 и столкнулся с небольшой проблемой или не понимаением,...

Silverlight +Ado.net Entity Framework
Народ! хелп плиз ...кучу всего пересмотрел-научился работать с БД используя все, кроме...

Свой метод с фильтром в Entity Framework
Добрый день. Смог создать модель DomainService.cs. В ней есть метод GetPeopes(). Возвращает всех...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.