Получение Null Reference Exception при доступе к столбцам из других таблиц - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь выполнить CRUD-операции в c #, используя Linq для продуктов базы данных NWTraders. При добавлении нового продукта я пытаюсь отобразить имя поставщика и название категории вместо идентификатора поставщика и идентификатора категории (которые являются внешними ключами таблицы «Продукт»).

Я попытался добавить новый продукт, и он падает вскоре после нажатия кнопки ОК, чтобы сохранить его в базе данных и обновить сетку данных. Но я заметил, что новый продукт обновляется в базе данных с идентификаторами поставщиков и категорий как Null, что еще больше препятствует мне получить доступ к самой форме Windows продукта, поскольку он не может получить идентификаторы соответствующих поставщиков и названия категорий, которые яЯ даю новый продукт во время ДОБАВЛЕНИЯ.

cmbSupplierName.SelectedIndex, кажется, получает значение NULL, и this.product.Supplier.Company генерирует исключение Null Reference. Это же проблема с категорией. Если я обработаю их с условием if, то он все равно выдаст мне исключение в приведенном ниже коде.

private void LoadProductInformation()
        {


            lblProductHeader.Text = "Information about :" + this.product.ProductName;
            txtProductID.Text = this.product.ProductID.ToString();
            txtProductName.Text = this.product.ProductName;
// Not loading for Add Products as User has to enter the values.
            if (this.Mode != ProductViewMode.Add)
            {
                cmbSupplierName.SelectedIndex = cmbSupplierName.FindString(this.product.Supplier.CompanyName);
                cmbCategory.SelectedIndex = cmbCategory.FindString(this.product.Category.CategoryName);


                txtQuantityPerUnit.Text = this.product.QuantityPerUnit;
                txtUnitPrice.Text = this.product.UnitPrice.Value.ToString("C");

                txtUnitsInStock.Text = this.product.UnitsInStock.Value.ToString();
                txtUnitsOnOrder.Text = this.product.UnitsOnOrder.Value.ToString();
                txtReorderLevel.Text = this.product.ReorderLevel.Value.ToString();


                chkDiscontinued.Checked = (this.product.Discontinued == true);
            }

        }

public void LoadDGVProducts(IEnumerable<Product> products)
        {
            // If there are no products, do nothing and return from the function.
            if (products == null) return;
            FetchData(); //fetching all the serach parameters 

            this.dgvProducts.SelectionChanged -= new System.EventHandler(this.DGVProducts_SelectionChanged);


            if (dgvProducts.RowCount == 0)
                FormatDGVProducts();

            dgvProducts.Rows.Clear();

            // Go through every product in the product collection and 
            // add it as a row in the dgv

                foreach (Product prod in products)
                {
                    dgvProducts.Rows.Add(
                        prod.ProductID, // The ID will not actually be shown since it is given to a column that has the Visible property set to False.
                        prod.ProductName,
                        prod.Supplier.CompanyName,
                        prod.Category.CategoryName,
                        prod.QuantityPerUnit,
                        prod.UnitPrice.Value.ToString("C"),
                        prod.UnitsInStock,
                        prod.UnitsOnOrder,
                        prod.ReorderLevel,
                        prod.Discontinued
                        );
                ...........................
            }
        }

Из-за того, что идентификаторы поставщиков и категорий получают нулевые значения в базе данных, этовыдает мне исключения в 'foreach', так как он не позволяет продукту отображаться в сетке данных, если хотя бы одно из значений null в этом условии.

Я не знаю, где я долженподключите идентификатор поставщика к имени, чтобы он не получал пустые значения в базе данных.

...