Я пытаюсь выполнить 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 в этом условии.
Я не знаю, где я долженподключите идентификатор поставщика к имени, чтобы он не получал пустые значения в базе данных.