У меня есть Модель продукта, которая содержит внешний ключ к записи ProductCategory и выглядит следующим образом.
public class ProductModel : IProductModel
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public string ProductDescription { get; set; }
public string ProductImagePath { get; set; }
public decimal? PricePerMonth { get; set; }
public bool ProductActive { get; set; }
public ProductCategory ProductCategory { get; set; }
}
По какой-то причине каждый раз, когда создается новый продукт, также создается новая категория продукта, для всех его значений в базе данных устанавливается значение NULL, за исключением поля ProductCategoryID, которое создается автоматически.
В моем представлении Создать у меня есть форма, которая содержит раскрывающийся список, заполненный ProductCategories. Как только форма отправлена, вызывается действие Создать (продукт продукта) и создается новый продукт. На этом этапе также создается новая ProductCategory, поведение которой мне не нужно.
My Create (продукт продукта) Действие выглядит следующим образом:
//
// POST: /Product/Create
[HttpPost]
public ActionResult Create(Product product)
{
int productCategoryID = product.ProductCategory.ProductCategoryID;
product.ProductCategoryID = productCategoryID;
_productService.InsertProduct(product);
}
... и мои методы InsertProduct выглядят так ...
public void InsertProduct(Product product)
{
Db.Products.AddObject(product);
Save();
}
Почему этот код вызывает создание новой категории продукта каждый раз?
РЕДАКТИРОВАТЬ: Добавление определения таблицы, в ответ на данный ответ, который запрашивает дополнительную информацию:
TABLE Product (
ProductID INT PRIMARY KEY IDENTITY(1,1),
ProductCategoryID INT, -- FK to ProductCategory
ProductName NVARCHAR(255),
ProductDescription NVARCHAR(MAX),
ProductImagePath NVARCHAR(1024),
PricePerMonth DECIMAL(7,2), -- ex 11111.11
ProductActive BIT NOT NULL DEFAULT(1)
)
TABLE ProductCategory (
ProductCategoryID INT PRIMARY KEY IDENTITY(1,1),
ProductCategoryName NVARCHAR(255),
ProductCategoryDescription NVARCHAR(MAX),
ProductCategoryActive BIT NOT NULL DEFAULT(1)
)
РЕДАКТИРОВАТЬ 2:
Я до сих пор не понимаю, почему именно, но мне удалось обойти эту проблему с помощью следующих изменений, внесенных в мое действие Создать (продукт):
var productCategoryID = product.ProductCategory.ProductCategoryID;
product.ProductCategoryID = productCategoryID;
var newProduct = new Product
{
ProductName = product.ProductName,
ProductDescription = product.ProductDescription,
PricePerMonth = product.PricePerMonth,
ProductImagePath = product.ProductImagePath,
ProductCategoryID = productCategoryID
};
_productService.InsertProduct(newProduct);
РЕДАКТИРОВАТЬ 3:
Я все еще пытаюсь обернуть голову вокруг всего этого, но ... Я обнаружил, что эта проблема имеет отношение к члену ProductCategory класса Product. Из того, что я могу сказать, ModelBinding автоматически заполняет это свойство новой ProductCategory при каждой отправке формы. Я могу последовательно избежать проблемы, с которой я столкнулся здесь, явно установив Product.ProductCategory = null;