powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как всё-таки правильно работать с DbContext (EF CF)?
6 сообщений из 6, страница 1 из 1
Как всё-таки правильно работать с DbContext (EF CF)?
    #37906241
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раньше делал аппликации, которые работали на мобильных устройствах, ну в крайнем случае - обладали монопольным доступом к базе. Поэтому создавал один раз SqlConnection\DbContext и уже не уничтожал их до самого конца.

И как-то всё было без печали.

Теперь решил всё сделать "по уму". Работаю с DbContext-ом используя using.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public List<T> getInstanceFromMemory<T>() where T : class
        {
            List<T> listFromMemory;

            using (dbReal db = new dbReal())
            {
                listFromMemory = (from anInstance in db.Set<T>()
                                          select anInstance).ToList();
            }

            return listFromMemory;
        }



Да, считываются все объекты в память - я знаю.

Сразу после выполнения запроса - все мои POCO-сущности начинают болтаться как г-но в проруби. Жаль, но правда.

Ну так вот, изменил я пару сущностей и настало время записать их обратно в базу.

Вот она:

Код: 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.
public class MapObject :iDB
    {
         Guid _id;

        [Key]
        public Guid id
        {
            get { return _id; }
            set { _id = value; }
        }

        public MapObject()
        {
            id = Guid.NewGuid();
        }

    

        mapObjectTypes _typeOfObject;

        public mapObjectTypes typeOfObject
        {
            get { return _typeOfObject; }
            set { _typeOfObject = value; }
        }
}




Проблема в общем в mapObjectTypes . Их в таблице должно быть всего два. Присваиваются в коде.
Но при сохранении нового MapObject - EF пытается создать третью запись, и вылетает конечно с ошибкой.

Потому как объекта там вообще может быть только два.

Отсюда вопрос - как надо вообще сохранять новые объекты?

1. Объект создается.
2. Инициализирует свои поля (пускай даже сущностями из DbContext)
3. DbContext - делает dispose
4. Объекты остаются "сами по себе". Работают, используя свои данные.
5. Пришло время сохранить объект.

6. У меня получилось только так:
6.1 Пытаемся читать объект в DbContext.
6.2 Если есть - делаем update полей.
6.3 Если нету - делаем...

Что делаем? Заново инициализируем объект всеми его полями? Старый DbContext-то уже умер. Но это же бред.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  public void save()
        {
            using (dbReal df = new dbReal())
            {
                MapObject anEntity = df.Set(this.GetType()).Find(this.id) as MapObject;

                if (anEntity == null)
                {
                    df.Set(this.GetType()).Add(this); //Вот тут добавляется запись, нарушающая уникальность PK
                }
                else
                {
                    //  df.Set(this.GetType()).Attach(this);
                    syncro(anEntity);

                }
                df.SaveChanges();
            }
        }
...
Рейтинг: 0 / 0
Как всё-таки правильно работать с DbContext (EF CF)?
    #37906243
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monochromatique,

мне кажется тут самый верный способ такой:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  public virtual TEntity Save(TEntity entity)
        {
            using (var oc = new TObjectContext())
            {
                oc.AddObject(oc.GetEntitySetName(typeof(TEntity).Name), entity);
                oc.SaveChanges();
            }
          
            return entity;
        }
...
Рейтинг: 0 / 0
Как всё-таки правильно работать с DbContext (EF CF)?
    #37906266
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, так это ж по сути тоже самое.

Если в сохраняемом объекте есть поле со ссылкой не объект, которого НЕТ в DbContext, то EF попытается его ДОБАВИТЬ.
Искать она его не будет.

Слишком имхо низкоуровневая она какая-то. Всё вручную надо делать. Если типа объект новый (ADD), то и все его поля тоже новые?

Смешно и грустно.
...
Рейтинг: 0 / 0
Как всё-таки правильно работать с DbContext (EF CF)?
    #37906742
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monochromatique,

не совсем понял вопрос тогда. А если так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
  public virtual void Update(TEntity entity)
        {
            using (var oc = new TObjectContext())
            {
                oc.CreateObjectSet<TEntity>().Attach(entity);
                oc.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
                oc.SaveChanges();
            }
        }
...
Рейтинг: 0 / 0
Как всё-таки правильно работать с DbContext (EF CF)?
    #37906780
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan,

Ага, и вся штука в том, что если у entity есть ссылки на другие объекты - то их тоже надо добавлять в TObjectContext().

Даже если они были извлечены когда-то оттуда (но другого экземпляра.)
...
Рейтинг: 0 / 0
Как всё-таки правильно работать с DbContext (EF CF)?
    #37906799
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monochromatique,

теперь понял о чем вы. да, интересно. КАк вариант просто делать по другому концептуальную модель.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как всё-таки правильно работать с DbContext (EF CF)?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]