Я сделал SaveChanges () , но я вижу это как обходной путь.
Недостаток этого: когда пользователь отменяет действие, новый объект будет в БД.
Вариант использования: «Создать человека»
- Пользователь выбирает пункт меню (или кнопку или что-то еще) с именем «Создать человека» (и новый пользователь должен появиться в элементе управления GridView, например - вызывается SaveChanges ())
- Пользователь заполняет имя, фамилию и т. Д.
- Но затем пользователь обнаруживает, что ему не нужно создавать этого человека (например, пользователь вспоминает, что он создал этого человека уже вчера)
- Пользователь не нажимает кнопку «Сохранить» (пункт меню или что-то еще ;-)), он использует пункт меню «Отмена» (или кнопку или что-то еще) - и поэтому в БД будет сирота
Другой подход: чтобы добавить нового человека (еще не зафиксированного) в элемент управления 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);