我有这种情况(MVC + EF)
我在数据库中有两个表Category和Product。
最初,我为Category创建了一个BLL。 BBL有CRUD方法。
在D(删除)中。此方法将按ID删除类别。
因此。关于BBL类别的一切都已完成。
接下来,我为Product创建一个BLL。它也有CRUD方法。
在C(创建)视图中。我展示了一个HTML,这是一个产品类别列表。
我想问的问题是:
当我将Product BLL添加到我的项目中时。我必须修改Category BLL的Delete方法。
我有/想要将名为DeleteProductByCategoryID()的新方法添加到BBL。我在Category BLL的Delete方法中称之为。
public void Delete(int id)
{
xxxxx.DeleteProductByCategoryID(id);
categoryBLL.DeleteCategory(id);
}
该方法将删除指定类别ID的所有产品。
所以问题是:我应该在哪里创建DeleteProductByCategoryID()方法(类别或产品BLL)?
要在Controller.Product.Create()视图中显示Category列表,我还想创建一个新方法来获取Category的集合。我应该将此方法放在Product BLL或Category BLL中吗?
答案 0 :(得分:0)
通常,产品(至少)有一个类别而不是其他类别。通过categoryId删除产品是否有意义(例如,当产品绑定到多个类别时)?
但无论如何,通常你不想创建硬依赖。
一种可能性是在产品数据库中创建复合关键表,其中包含 ProductId 的所有可能的 CategoryId 。这样,您就可以在Product和Category之间建立连接,但是您不会创建任何硬DB依赖项,因为该表仅包含值。这也简化了CRUD操作。通常,这样的复合表的命名方式如下: Entity1_has_Entity2 。
[Product_has_Category]
[ProductId] PK, NOT NULL
[CategoryId] PK, NOT NULL
填写第10,13和5类中的ProductId 1:
[1, 10]
[1, 13]
[1, 5]
在这种情况下,删除方法应该放在ProductBLL中,看起来像这样:
public void Delete(int id)
{
// delete the _has_ relations - there is no connection between product and category anymore
productBLL.DeleteCategoriesForProduct(id);
productBLL.DeleteProduct(id);
}
ProductBLL中的 show 方法也很简单:
public void ShowCategoriesForProduct(int id)
{
// from the _has_ relations table
List<int> categoryIds = productBLL.CategoriesForProduct(id);
foreach (int categoryId in categoryIds)
{
var categoryName = categoryBLL.CategoryInfo(categoryId).Name;
}
}
我会把问题分类为数据库规范化而不是设计模式。关于数据库规范化的一个很好的例子可以在this article中找到。