Удаление множества ассоциаций в NHibernate - PullRequest
3 голосов
/ 16 декабря 2008

У меня есть отношения многие ко многим, использующие NHibernate.

Существует ли более простой способ удаления ассоциации категорий из всех продуктов без создания класса для таблицы соединений?

Я бы хотел, чтобы SQL выглядел как

DELETE FROM ProductCategories WHERE CategoryId = 123

и вот код, который мы используем для удаления ассоциаций

        DetachedCriteria fetchCriteria = DetachedCriteria.For<Product>()
            .CreateAlias("Categories", "categories")
            .Add(Restrictions.Eq("categories.Id", category.Id));

        ICollection<Product> products = productRepo.FindAll(fetchCriteria);

        foreach(var product in products)
        {
            product.Categories.Remove(category);
            productRepo.Save(product);
        }

Продукт имеет набор категорий

public class Product{
    public ISet<Category> Categories
    {
        get;set;
    }
}

Категория имеет свойство Id Guid

public class Category {
    public Guid Id {get;set;}
    public string Name {get;set;}
}

Большое спасибо: о)

1 Ответ

3 голосов
/ 18 декабря 2008

Вы пробовали использовать метод ISession.Delete(query)? Он принимает HQL-запрос, загружает объекты и затем удаляет их.

session.Delete("from Product p join p.Categories c where c.id = :category", category, NHibernateUtil.Entity(typeof(Category)));

Мой HQL довольно ржавый, поэтому извините, если запрос не совсем верный.

Другой вариант, если вам не нужна идея предварительной загрузки всех объектов, - это использовать session.CreateSQLQuery и просто передать прямой SQL-оператор для удаления. NHibernate выполнит это на сервере без вопросов.

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