/// <summary> /// Handles changes for all fields except contact as contact in this case /// is a derived class used to represent data from a child class, contact title /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void gridView_CurrentCellDirtyStateChanged(object sender, EventArgs e) { /* * We need to know which column the current cell name is to set properties * below */ var currentColumnName = gridView.CurrentCell.OwningColumn.Name; var customerEntity = _customersBindingSource.CurrentCustomerEntity(); var customer = context.Customers .FirstOrDefault(cust => cust.CustomerIdentifier == customerEntity.CustomerIdentifier); /* * Handle DataGridViewComboBox columns * * IMPORTANT: Here FirstOrDefault is used without checking if the returning * item is null or not, for your project check for null. */ try { if (currentColumnName == "ContactTitleColumn") { // ReSharper disable once PossibleNullReferenceException var contactTitleIdentifier = context.ContactTypes .FirstOrDefault(contactType => contactType.ContactTitle == gridView.EditingControl.Text) .ContactTypeIdentifier; context.Entry(customer).Property(x => x.ContactTypeIdentifier) .CurrentValue = contactTitleIdentifier; } else if (currentColumnName == "CountyNameColumn") { var countryIdentifier = context.Countries .FirstOrDefault(country => country.Name == gridView.EditingControl.Text) .CountryIdentifier; context.Entry(customer).Property(x => x.CountryIdentifier) .CurrentValue = countryIdentifier; } else { context.Entry(customer).Property(gridView.CurrentCell.OwningColumn.DataPropertyName) .CurrentValue = gridView.EditingControl.Text; } } catch (Exception ex) { /* * rule violations e.g. max length exceeded, required field empty * which would be annotated on class properties used to communicate * with tables in the database. */ MessageBox.Show(ex.Message); } }
/// <summary> /// Demo get only changed fields /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { var item = view.FirstOrDefault(c => c.CustomerIdentifier == 4); var entry = context.Entry(item); if (entry.State != EntityState.Modified) { return; } //CheckIfDifferent(entry); var originalEntity = context.Customers.AsNoTracking() .FirstOrDefault(me => me.CustomerIdentifier == item.CustomerIdentifier); Console.WriteLine(); foreach (var propertyName in entry.CurrentValues.PropertyNames) { //Console.WriteLine("Property Name: {0}", propertyName); //get original value var orgVal = entry.OriginalValues[propertyName]; //Console.WriteLine(" Original Value: {0}", orgVal); //get current values var curVal = entry.CurrentValues[propertyName]; //Console.WriteLine(" Current Value: {0}", curVal); if (!orgVal.Equals(curVal)) { Console.WriteLine($"{propertyName} -> {orgVal} - {curVal}"); } } }