LINQtoSQL - Как мне получить мой запрос, чтобы узнать, какую таблицу я хочу? - PullRequest
0 голосов
/ 13 августа 2010

Я использую 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 ]

1 голос
/ 13 августа 2010

Вы создаете экземпляр своего хранилища, но никогда не инициализируете его.

Строка должна выглядеть примерно так:

IProductRepository productsRepository = new ProductRepository();

Либо это, либо вы должны разрешить вызывающей стороне вводить (либо метод, либо конструктор) хранилище:

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

UPDATE

Если вы используете nInject для внедрения зависимостей, объявление вашего метода должно выглядеть следующим образом (предполагается, что nInject настроен правильно для внедрения зависимости):

[Inject]
public void DeleteCategory(Category category,
    IProductRepository productRepository)
{
}
0 голосов
/ 13 августа 2010

Именно то, что сказал Джастин ... но только чтобы прояснить для вас ...

IProductsRepository productsRepository = new ProductsRepository();

Но вы, скорее всего, столкнетесь здесь с проблемами, если каждый репозиторий создаст свой собственный объект DataContext. В этом случае LINQ будет возражать, что вы работаете с одними и теми же связанными данными в двух отдельных объектах DataContext (поскольку каждый созданный вами объект DataContext отслеживает измененные записи).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...