1

У меня есть приложение WinForms с группой текстовых полей для объекта, давайте называть Entity ProductDataBound обновления TextBox не сохраняются в БД

Один из моих текстовых скрыт, потому что он имеет внешний ключ в другую базу данных объект Business Unit. Я заполняю скрытое текстовое поле, используя поле со списком, которое ищет значения в родительской таблице. Когда выбор изменяется, также значение в скрытом текстовом поле.

private void businessUnitComboBox_SelectionChangeCommitted(object sender, EventArgs e) 
    { 
     this.businessUnitIdTextBox.Text = this.businessUnitComboBox.SelectedValue.ToString(); 

     this.businessUnitComboBox.Focus(); 
    } 

Проблема заключается в вызове SaveChanges в моем контексте, это изменение в скрытом текстовом поле не сохраняется. Как ни странно, если я обновляю любой из других текстовых полей Product, они сохраняют только штраф.

Текстовые поля были добавлены в проект со стандартным перетаскиванием и перетаскиванием из графического интерфейса Visual Studio, и при добавлении автоматически создается источник связывания.

Мои объекты реализуют INotifyPropertyChanged, используя fody-propertychanged.

Я изо всех сил пытаюсь найти проблему здесь. Создание новых записей отлично работает, но обновление этого значения для внешнего ключа никогда не выполняется.

Это потому, что это свойство навигации и нужно обрабатывать по-разному, или есть другие возможности, почему изменения не сохраняются? Буду признателен за любую оказанную помощь.

+0

Можем ли мы увидеть ваш класс модели продукта? – samiz

+0

Я смог решить эту проблему, назначая непосредственно внешнему ключевому объекту вместо идентификатора внешнего ключа. Класс 'Product' - POCO с включенной магией fody-INotifyPropertyChanged. Но я использую Presenter как посредник между формой и контекстом. Теперь я передаю «BusinessUnitBindingSource.Current» в презентаторе и устанавливаю свойство навигации вместо Id. – wesmantooth

ответ

1

Возможно, это из-за отсутствия этого. Validate() в методе сохранения. Поместите этот код в метод сохранения формы.

this.Validate(); 
this.yourBindingSource.EndEdit(); 
yourDbContext.SaveChanges(); 

Поведение по умолчанию привязки данных по умолчанию - OnValidation.

Чтобы изменить это поведение, вы можете перейти к своим свойствам текстового поля, открыть часть привязки данных, открыть расширенный, изменить режим обновления источника данных на OnPropertyChanged.

Поэтому код Вашего привязки данных в конструкторе генерируется код будет выглядеть следующим образом:

this.nameTextBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.productBindingSource, "Category.Name", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 

В этом случае вам не нужно использовать this.Validate перед сохранением изменений, и вы можете просто использовать

this.yourBindingSource.EndEdit(); 
yourDbContext.SaveChanges(); 
+0

Благодарим вас за предложения и объяснения DataSourceMode. Я новичок в структуре и не знал об этих конфигурациях. К сожалению, добавление этих строк не изменило моей ситуации. Я смог решить эту проблему, назначая непосредственно внешнему ключевому объекту вместо идентификатора внешнего ключа. Поэтому я использую 'Product.BusinessUnit = BusinessUnitBindingSource.Current' вместо' Product.BusinessUnitId = (int) this.businessUnitIdTextBox.Text' – wesmantooth

Смежные вопросы