C# — Entity Framework добавляет новый объект в ObjectContext

Я работаю с Entity Framework, SQL и C#.

у меня есть таблица под названием «Клиент» и другая, называемая «clients_phone».

У меня есть форма с Xtragrid, и с помощью BindingSource я привязываю IQueryable к сетке.

myBindingSource = new BindingSource();
myBindingSource.DataSource = clients;  //Clients it is the IQueryable<Client>
myBindingSource.DataMember = "clients_phone";
myBindingSource.AllowNew = true;

Затем я хочу добавить новый client_phone в свой клиент. Для этого я создаю New Client(), а затем добавляю Phone.

clients newclient = objContext.CreateObject<clients>();

newclient.clients_phone = newClients_Phone;

objContext.AddObject("Clients", newclient);

Наконец, я добавляю новый client_phone в ObjectContext, но когда я вижу Xtrag, client_phone не отображается.

Любая идея о том, что происходит??.

Спасибо


person Mark Comix    schedule 14.07.2010    source источник
comment
Вы обновляете BindingSource? Для контекста объекта нет способа уведомить BindingSource об изменении базовых данных, поэтому вам потребуется обновить его вручную.   -  person CodingGorilla    schedule 14.07.2010
comment
Как это сделать? Как обновить BindingSource??.   -  person Mark Comix    schedule 15.07.2010
comment
Обычно я просто повторяю код привязки, возможный рефакторинг вашего кода в метод, а затем вы можете просто вызвать его снова после внесения изменений.   -  person CodingGorilla    schedule 15.07.2010
comment
Вы ищете что-то вроде этого newclient.clients_phone = newClients_Phone.include(childtable);   -  person CodeSpread    schedule 30.11.2012
comment
Похоже, что Entity Framework не уведомляет о добавлении нового объекта. Я проверил это, и это правда. Он работает для изменений в существующем, а также для удаления, но AddObject кажется сломанным и не отправляет никаких уведомлений. Мы пробовали с 3 разными DataGridView   -  person Marc Roussel    schedule 24.02.2017


Ответы (3)


Лукас Б прав. Всякий раз, когда вы добавляете все новые Clients и Clients_phone, вам нужно вызвать метод SaveChanges(), чтобы сохранить данные в базе данных.

Нужно ли вам сначала создать клиент, а затем выполнить обновление, чтобы добавить дополнительные записи client_phone или что-то еще. Если вы никогда не вызываете метод SaveChanges(), ничего из того, что вы делаете, не будет сохранено обратно в базу данных.

person Gareth Oates    schedule 10.08.2011

Вы пытались сохранить и зафиксировать объект?

objContext.SaveChanges(true);

objContext.AcceptAllChanges();
person Lucas B    schedule 14.07.2010
comment
Нет, потому что мне нужно добавить много Clients_Phone к одному клиенту. Итак, я не могу сохранить изменения, пока все не будут добавлены. - person Mark Comix; 15.07.2010
comment
Может быть, я что-то упускаю, если вы не сохраняете изменения обратно в базу данных, как вы ожидаете увидеть их в сетке, привязанной к запросу базы данных? - person CodingGorilla; 15.07.2010

Я выполнил SaveChanges(), но вижу в этом обходной путь.

Недостаток этого: когда пользователь отменяет действие, новый объект будет в БД.

Вариант использования: «Создать человека»

  1. Пользователь выбирает пункт меню (или кнопку или что-то еще) с именем "Создать человека" (и новый пользователь должен появиться, например, в элементе управления GridView - вызывается SaveChanges())
  2. Пользователь заполняет Имя, Фамилию и т.д.
  3. Но затем пользователи обнаруживают, что ему не нужно создавать этого человека (например, пользователь помнит, что он создал этого человека еще вчера)
  4. Пользователь не нажимает кнопку Сохранить (пункт меню или что там ;-)) он использует пункт меню "Отмена" (или кнопку или что там) - так и будет человек-сирота в БД

Другой подход: чтобы добавить нового человека (еще не зафиксированного) в элемент управления GridView, вы можете установить для DataSource значение «текущие люди + новый человек».

    private object GetBindingList(ObjectSet<Person> contextObjects, Person newObject)
{
  List<Person> list = new List<Person>();

  list.AddRange(contextObjects);
  list.Add(newObject);

  return list;
}

Применение:

PersonsBindingSource.DataSource = GetBindingList(Context.PersonSet, newPerson);

Но у этого есть недостаток: это работает только в первый раз... Итак, вам нужно что-то вроде:

PersonsBindingSource.DataSource = GetBindingList(Context.PersonSet, newPerson);
Context.PersonSet = Populate with persons from PersonsBindingSource.DataSource // ;-)

Но почему contextObjects.AddObject(newObject); не работает (новый элемент не будет отображаться в GridView - проблема возникает только для объектов без внешних ключей к другим объектам)

Также работает только при вызове SaveChanges():

PersonsBindingSource.DataSource = Context.PersonSet.Execute(MergeOption.AppendOnly);
person hfrmobile    schedule 16.11.2011