LINQtoSQL - 如何让我的查询识别出我想要的表?

时间:2010-08-13 15:11:37

标签: asp.net-mvc linq-to-sql asp.net-mvc-2

我正在使用LINQtoSQL创建级联删除IE:如果删除了类别,那么该类别中的所有产品也将被删除。

我已经设置了产品资源库(IProductsRepository),现在我在我的类别资源库中工作,为级联添加业务域逻辑。

产品库有这种方法:

public void DeleteProducts(IList<Product> Products)
    {
        foreach (Product product in Products)
        {
            productsTable.DeleteOnSubmit(product);
        }
        productsTable.Context.SubmitChanges();
    }

然后我在我的类别存储库中创建一个删除类别方法:

    public void DeleteCategory(Category category)
    {
        IProductsRepository productsRepository;

        var CascadeDeleteProducts =
            from Products in productsRepository.Products
            where Products.CategoryID == category.CategoryID
            select Products;

        productsRepository.DeleteProducts(CascadeDeleteProducts.ToList());

        categoriesTable.DeleteOnSubmit(category);
        categoriesTable.Context.SubmitChanges();
    }

Visual Studio 2010在此行的上述函数中给出了错误:from Products in productsRepository.Products。它说

  

使用未分配的局部变量'productsrepository'

可能导致此错误的原因是什么?我正在通过DI创建产品存储库:IProductsRepository productsRepository;。我做错了什么?

修改

我忽略了提到我正在使用Ninject来实例化产品库。所以我认为这一行:IProductsRepository productsRepository;正在有效地声明和初始化产品库。

2 个答案:

答案 0 :(得分:1)

您正在创建存储库的实例,但您从未初始化它。

该行应如下所示:

IProductRepository productsRepository = new ProductRepository();

或者您应该允许调用者注入(方法或构造函数)存储库:

public void DeleteCategory(Category category, 
    IProductRepository productRepository)
{
}

<强>更新

如果您正在使用nInject进行依赖注入,那么您的方法声明应该是这样的(假设您已正确配置nInject以注入依赖项):

[Inject]
public void DeleteCategory(Category category,
    IProductRepository productRepository)
{
}

答案 1 :(得分:0)

贾斯汀说的正是......但只是为了澄清......

IProductsRepository productsRepository = new ProductsRepository();

但是,如果每个存储库都实例化它自己的DataContext对象,那么您可能会遇到问题。在这种情况下,LINQ将反对您在两个单独的DataContext对象中处理相同的相关数据(因为您创建的每个DataContext对象都会跟踪已更改的记录)。