C # - Entity Framework добавить новый объект в ObjectContext - PullRequest
1 голос
/ 14 июля 2010

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

У меня есть таблица под названием Client и другая под названием 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 к моему клиенту. Для этого я создаю новый клиент (), а затем добавляю телефон.

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

newclient.clients_phone = newClients_Phone;

objContext.AddObject("Clients", newclient);

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

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

Спасибо

Ответы [ 3 ]

2 голосов
/ 10 августа 2011

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

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

1 голос
/ 15 июля 2010

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

objContext.SaveChanges(true);

objContext.AcceptAllChanges();
0 голосов
/ 16 ноября 2011

Я сделал 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);
...