1

我有这种情况(MVC + EF)

我在数据库中有两个表类别和产品。

Initlialy,我为类别创建了一个 BLL。BBL 有 CRUD 方法。

在 D(删除)中。此方法将按 ID 删除类别。

所以。关于类别 BBL 的一切都已完成。

接下来,我为 Product 创建一个 BLL。它也有 CRUD 方法。

在 C(创建)视图中。我显示一个 HTML ,这是产品的类别列表。

我想在这里问的问题:

当我将产品 BLL 添加到我的项目时。我必须修改 Category BLL 的 Delete 方法。

我有/想要将名为 DeleteProductByCategoryID() 的新方法添加到 BBL。我在类别 BLL 的 Delete 方法中调用它。

public void Delete(int id)
{
xxxxx.DeleteProductByCategoryID(id);
categoryBLL.DeleteCategory(id);
}

该方法将删除指定类别 ID 的所有产品。

所以问题是:我应该在哪里创建 DeleteProductByCategoryID() 方法(类别或产品 BLL)?

要在 Controller.Product.Create() 视图中显示类别列表,我还想创建一个新方法来获取类别集合。我应该将此方法放在 Product BLL 还是 Category BLL 中?

4

1 回答 1

0

通常,产品具有(至少)一个类别而不是其他类别。通过 categoryId 删除产品是否有意义(例如当产品绑定到多个类别时)?

但无论如何,通常你不想创建硬依赖。

一种可能性是在 Product DB 中创建一个复合键表,其中包含一个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;
    }
}

我会将问题归类为数据库规范化而不是设计模式。可以在本文中找到有关 DB 规范化的一个很好的示例。

于 2013-10-27T16:54:29.803 回答