Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
hamin
594 / 390 / 236
Регистрация: 21.11.2012
Сообщений: 1,177
1

Entity Framework и ObservableCollection

04.04.2016, 17:41. Просмотров 1803. Ответов 3
Метки нет (Все метки)

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

к примеру у меня есть 2 таблицы в бд, связанные по ключу idKurs

есть простой контрол, в котором вверху комбобокс со списком курсов и ниже датагрид, который отображает для каждого курса список студентов.

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

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
        #region LOKALE VARIABLEN
        private PortfolioEntities _entity;
        private ObservableCollection<Kurs> _listKurse;
        private ObservableCollection<Student> _listStudent;
        private Kurs_aktKurs;
        #endregion
 
        #region PROPERTIES
        public ObservableCollection<Student> ListStudent
        {
            get { return _listStudent; }
            set 
            { 
                _listStudent = value; 
                OnPropertyChanged(); 
            }
        }
        public Kurs AktKurs
        {
            get { return _aktKurs; }
            set
            {
                _aktKurs = value;
                if (value != null) Laden();
                OnPropertyChanged();
            }
        }
        public PortfolioEntities Entity
        {
            get 
            {
                if (_entity == null) _entity = new PortfolioEntities();
                return _entity; 
            }
            set { _entity = value; }
        }
        public ObservableCollection<Kurs> ListKurse
        {
            get { return _listKurse; }
            set 
            { 
                _listkurse = value;
                OnPropertyChanged();
            }
        }
        #endregion


свойство AktKurs биндится к SelectedItem комбобокса и отвечает за выбранный курс.
теперь следущее: в конструкторе viewModel у меня в список ListKurse грузятся все существующие курсы из бд:

C#
1
2
3
4
5
public ViewModelGeschäftsjahr()
{
      (from st in Entity.Kurse select st).Load();
      ListKurse = Entity.Kurse.Local;
}
теперь начнутся мои вопросы) у меня есть метод Laden, который должен подгружать студентов для текущего курса. Он вызывается в самом сеттере свойства см.выше. пользователь должен иметь возможность удалять студентов из заданного курса, редактировать и добавлять. для начала хочу разобраться с простым отображением студентов.. где-то на буржуйских форумах читал, что правильней использовать след. конструкцию при подключении к бд:

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

C#
1
2
3
4
5
6
7
8
private void Laden ()
{
   using (PortfolioEntities entity = new PortfolioEntities)
   {
       (from st in entity.Student where AktKurs.idKurs == st.idKurs select st).Load();
       ListStudent = entity.Student.Local;
   }
}


при таком подходе все отображается верно, но тогда как сохранить изменения или добавить или удалить студента в определенный курс, ведь если я правильно понял при выходе из using вызывается метод Dispose контекста и записи нельзя добавлять.

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

C#
1
2
3
4
5
private void Laden ()
{
       (from st in Entity.Student where AktKurs.idKurs == st.idKurs select st).Load();
       ListStudent = Entity.Student.Local;
}


то при каждой смене курса студенты добавляются к уже существующей коллекции.. т.е.
при загрузке контрола (курс 1) в Local 2 записи, после выбора, к примеру, курса 3 в список студентов подгружаются студенты из третьего курса и вместо отображения 2 студентов 3 курса я получаю 4 записи (+2 из курса 1). надеюсь объяснил доходчиво но в таком случае я могу делать с коллекцией студентов все что мне угодно и entity модель остается синхронна с изменениями и такое работает:

C#
1
2
3
4
private void insert ()
{
ListStudent.Add(new Student() {Name = "Zauchka"});
}
в итоге из-за незнания я придумывал костыли, чтобы обойти эту проблему:

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
private void Laden()
{
var query = from st in Entity.Student where st.idKurs == AktKurs.idKurs select st;
ListStudent = new ObservableCollection<Student>(query);
}
private void Insert()
{
var st = new Student() {Name = "Zauchka"};
ListStudent.Add(st);
Entity.Student.Add(st);
}


в итоге я получал то, что хотел, но понимал, что решение неправильно. Теперь хочу разобраться как все-таки делать правильно и чисто. Вроде как элементарные вещи, а вот не могу понять что да как. Помогите разобраться.
0
Миниатюры
Entity Framework и ObservableCollection  
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2016, 17:41
Ответы с готовыми решениями:

MVVM и Entity Framework
Всем привет.Столкнулся с проблемой в том что не сохраняет изменения в базе данных(в таблице...

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

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

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

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

3
amarf
Жуткая тВарЬ
382 / 318 / 134
Регистрация: 06.02.2015
Сообщений: 960
Записей в блоге: 1
Завершенные тесты: 3
04.04.2016, 18:07 2
hamin, Быстро почитал и не понял в чем проблема, добавляйте студентов в локальный контекст (.Local) и когда необходимо сохраняйте в БД DbRepository.SaveChanges()

Цитата Сообщение от hamin Посмотреть сообщение
вызывается метод Dispose контекста и записи нельзя добавлять
Не надо убивать контекст, просто сохраните на него ссылку в объекте.
0
hamin
594 / 390 / 236
Регистрация: 21.11.2012
Сообщений: 1,177
05.04.2016, 10:29  [ТС] 3
amarf,

добавляйте студентов в локальный контекст (.Local) и когда необходимо сохраняйте в БД DbRepository.SaveChanges()
да, это все хорошо работает, но я же написал, что если загружать студентов для каждого курса так:
C#
1
2
(from st in Entity.Student where AktKurs.idKurs == st.idKurs select st).Load();
ListStudent = Entity.Student.Local;
то при первом вызове для курса 1, к примеру в списке студентов будет (Ivanov, Sidorov), при втором вызове для курса 2, к примеру, в списке вместо 1 записи (Petrov) будет 3 (Ivanov, Sidorov,Petrov). Т.е. в .Local добавляются записи при каждом вызове. вот поэтому я и не знаю как правильно
0
amarf
Жуткая тВарЬ
382 / 318 / 134
Регистрация: 06.02.2015
Сообщений: 960
Записей в блоге: 1
Завершенные тесты: 3
05.04.2016, 11:09 4
hamin, Угу ! А как модель данных у тебя настроена? В Бд есть отношения один ко многим (многие ко многим)
Просто я совсем не пойму в чем трудность!!! Вот пример:
Модель

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Kurs
    {
        public int Id { get; set; }
        public string Name { get; set; }
 
        public virtual ObservableCollection<Student> Students { get; set; }
    }
 
 
    public class Student
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string SecondName { get; set; }
        public string LastName { get; set; }
 
        public virtual Kurs Kurs { get; set; }
    }


Вот контекст данных

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MySqlDbSample : DbContext
    {
        public MySqlDbSample() : base() { }
        public MySqlDbSample(string connection) : base(connection) { }
 
 
        public DbSet<Kurs> KursSet { get; set; }
        public DbSet<Student> StudentSet { get; set; }
 
//с этим можно не замарачиваться +)
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Kurs>().ToTable("Kurs");
            modelBuilder.Entity<Student>().ToTable("Student");
            base.OnModelCreating(modelBuilder);
        }
    }


Вот обращение к данным

C#
1
2
3
4
5
6
7
8
9
10
11
MySqlDbSample Db = new MySqlDbSample();
 
        void AnyMethmod()
        {
            var KURSes = Db.KursSet.Where((i) => i.Name.Contains("Строительство")).ToList();
            var KURS = KURSes.FirstOrDefault();
            foreach (var student in KURS.Students)
            {
                Debug.WriteLine($"К курсу с именем: {KURS.Name}, принадлежит студент {student.LastName}");
            }
        }
0
05.04.2016, 11:09
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2016, 11:09

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

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

DataGrid или ListView + Entity Framework
Столкнулся со следующей проблемой (на примере DataGrid, с ListView аналогичная штука). В...


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

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

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