Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 73
1

WPF MVVM EntityFramework SQLite работа с двумя и более таблицами

18.09.2019, 16:54. Показов 4115. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Изучая MVVM и EntityFramework возник вопрос как работать с двумя и более таблицами. Поиск в интернете выдает статьи где довольно понятно разбирается работа с одной таблицей.
Есть тестовый проект в в виде телефонного справочника. Информация об абонентах выводится/редактируется. Подскажите как наладить работу с (второй таблицей) телефонными номерами.

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
public class Abonent : INotifyPropertyChanged
    {
        public int Id { get; set; }
 
        private string fio;
        private string address;               
 
        public string Fio
        {
            get { return fio; }
            set
            {
                fio = value;
                OnPropertyChanged("Fio");
            }
        }
        public string Address
        {
            get { return address; }
            set
            {
                address = value;
                OnPropertyChanged("Address");
            }
        }
        
 
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
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
public class ApplicationViewModel : INotifyPropertyChanged
    {
        ApplicationContext db;
        RelayCommand addCommand;
        RelayCommand editCommand;
        RelayCommand deleteCommand;
        IEnumerable<Abonent> abonents;
 
        public IEnumerable<Abonent> Abonents
        {
            get { return abonents; }
            set
            {
                abonents = value;
                OnPropertyChanged("Abonents");
            }
        }
 
        public ApplicationViewModel()
        {
            db = new ApplicationContext();
            db.Abonents.Load();
            Abonents = db.Abonents.Local.ToBindingList();
        }
        // команда добавления
        public RelayCommand AddCommand
        {
            get
            {
                return addCommand ??
                  (addCommand = new RelayCommand((o) =>
                  {
                      AbonentWindow abonentWindow = new AbonentWindow(new Abonent());
                      if (abonentWindow.ShowDialog() == true)
                      {
                          Abonent abonent = abonentWindow.Abonent;
                          db.Abonents.Add(abonent);
                          db.SaveChanges();
                      }
                  }));
            }
        }
        // команда редактирования
        public RelayCommand EditCommand
        {
            get
            {
                return editCommand ??
                  (editCommand = new RelayCommand((selectedItem) =>
                  {
                      if (selectedItem == null) return;
                      // получаем выделенный объект
                      Abonent abonent = selectedItem as Abonent;
 
                      Abonent vm = new Abonent()
                      {
                          Id = abonent.Id,
                          Fio = abonent.Fio,
                          Address = abonent.Address
                      };
                      AbonentWindow abonentWindow = new AbonentWindow(vm);
 
 
                      if (abonentWindow.ShowDialog() == true)
                      {
                          // получаем измененный объект
                          abonent = db.Abonents.Find(abonentWindow.Abonent.Id);
                          if (abonent != null)
                          {
                              abonent.Fio = abonentWindow.Abonent.Fio;
                              abonent.Address = abonentWindow.Abonent.Address;
                              db.Entry(abonent).State = EntityState.Modified;
                              db.SaveChanges();
                          }
                      }
                  }));
            }
        }
        // команда удаления
        public RelayCommand DeleteCommand
        {
            get
            {
                return deleteCommand ??
                  (deleteCommand = new RelayCommand((selectedItem) =>
                  {
                      if (selectedItem == null) return;
                      // получаем выделенный объект
                      Abonent abonent = selectedItem as Abonent;
                      db.Abonents.Remove(abonent);
                      db.SaveChanges();
                  }));
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
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
31
32
<Window x:Class="TSprv.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:TSprv"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="425">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="50" />
        </Grid.RowDefinitions>
        <ListBox x:Name="abonentsList" ItemsSource="{Binding Abonents}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Fio}" FontSize="16" />
                        <TextBlock Text="{Binding Address}" FontSize="12" />                        
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center">
            <Button Content="Добавить" Margin="10" Command="{Binding AddCommand}"  />
            <Button Content="Изменить" Margin="10" Command="{Binding EditCommand}" 
                    CommandParameter="{Binding ElementName=abonentsList, Path=SelectedItem}"  />
            <Button Content="Удалить" Margin="10" Command="{Binding DeleteCommand}" 
                    CommandParameter="{Binding ElementName=abonentsList, Path=SelectedItem}"  />
        </StackPanel>
    </Grid>
</Window>
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 RelayCommand : ICommand
    {
        private Action<object> execute;
        private Func<object, bool> canExecute;
 
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
 
        public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            this.execute = execute;
            this.canExecute = canExecute;
        }
 
        public bool CanExecute(object parameter)
        {
            return this.canExecute == null || this.canExecute(parameter);
        }
 
        public void Execute(object parameter)
        {
            this.execute(parameter);
        }
    }
C#
1
2
3
4
5
6
7
 public class ApplicationContext : DbContext
    {
        public ApplicationContext() : base("DefaultConnection")
        {
        }
        public DbSet<Abonent> Abonents { get; set; }
    }
Вложения
Тип файла: 7z TSprv.7z (21.91 Мб, 10 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2019, 16:54
Ответы с готовыми решениями:

Где можно прочитать или посмотреть примеры и рекомендации по созданию приложений WPF + MVVM + EntityFramework?
Информации по WPF + MVVM полно, но как правильно использовать с EF не могу найти и разобраться,...

Связь между двумя и более таблицами
Здравствуйте. Сделал БД через phpmyadmin, нормализовал по первым трем НФ. Простейшие запросы на...

EF MVVM работа со связанными таблицами
Здравствуйте! Помогите пожалуйста разобраться. Изучаю обозначенный выше вопрос по сайту...

Работа с двумя таблицами
Здравствуйте!!! Помогите решить задачу.Есть две таблицы одна справа другая слева. Нужно задать им...

3
управление сложностью
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
18.09.2019, 18:38 2
Вот, что-то подобное. Ошибка при запросе подчиненной таблицы DataBase First EF
У меня там ошибка была в том, что навигационные свойства не корректно прописал.
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 73
30.09.2019, 17:18  [ТС] 3
WPF MVVM EntityFramework SQL много примеров с одной таблицей, но не нашел ничего вразумительного с двумя и более. Покажите пожалуйста рабочий пример или исправьте мой. Спасибо.
0
управление сложностью
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
01.10.2019, 09:39 4
Цитата Сообщение от mansters Посмотреть сообщение
Покажите пожалуйста рабочий пример или исправьте мой. Спасибо.
Нужно разобраться с тем, как строится объектная модель EF. Для связи нескольких таблиц используется навигационное свойство.
0
01.10.2019, 09:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2019, 09:39
Помогаю со студенческими работами здесь

Работа с двумя таблицами
Всем привет! нуждаюсь в помощи и совете) вообщем есть две таблицы, продажа и склад. В обоих...

Работа с двумя таблицами сразу
Есть две таблицы: Pupils, Teachers Нужно вытащить поля name, number из обеих таблиц и...

Работа формы с двумя таблицами
Здравствуйте. Мне нужно создать форму, которая будет заполнять таблицу &quot;Прокат&quot;, с использованием...

Работа с двумя таблицами, мини база данных
Создаваемое приложение должно по каждому клиенту автосервиса хранить следующие сведения: Ф.И.О.;...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru