Обновления текстового поля с привязкой к данным не сохраняются в БД

У меня есть приложение winforms с группой текстовых полей для объекта, давайте назовем объект Product

Одно из моих текстовых полей скрыто, потому что оно содержит внешний ключ к другому объекту базы данных 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.

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

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


person wesmantooth    schedule 24.08.2015    source источник
comment
Можем ли мы увидеть ваш класс модели продукта?   -  person samiz    schedule 25.08.2015
comment
Мне удалось решить эту проблему, назначив непосредственно объекту внешнего ключа вместо идентификатора внешнего ключа. Класс Product — это POCO с включенной магией fody-INotifyPropertyChanged. Но я использую Presenter как посредника между формой и контекстом. Теперь я передаю BusinessUnitBindingSource.Current в презентатор и устанавливаю свойство навигации вместо Id.   -  person wesmantooth    schedule 25.08.2015


Ответы (1)


Возможно, это из-за отсутствия this.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();
person Reza Aghaei    schedule 24.08.2015
comment
Спасибо за предложения и объяснение DataSourceMode. Я новичок в фреймворке и не знал об этих конфигурациях. К сожалению, добавление этих строк не изменило мою ситуацию. Мне удалось решить эту проблему, назначив непосредственно объекту внешнего ключа вместо идентификатора внешнего ключа. Поэтому я использую Product.BusinessUnit = BusinessUnitBindingSource.Current вместо Product.BusinessUnitId = (int)this.businessUnitIdTextBox.Text - person wesmantooth; 25.08.2015