NHibernate вмъкване на обект с прокси асоциации без извличане

Да кажем, че има таблици с категории и продукти. И продуктът има присвоен идентификатор и референтна категория:

public class Product
{
    public virtual int ProductId { get; set; }
    public virtual Category Category { get; set; }
    public virtual String Name { get; set; }

    public Product() {}
    public Product(int productId, string name, Category category) { ... }
}

При вмъкване на три продукта по този начин:

        var session = sessionFactory.OpenSession();

        Product product = new Product(1, "New Product", session.Load<Category>(1));
        session.Save(product);
        session.Flush();

        product = new Product(2, "New Product 2", session.Load<Category>(2));
        session.Save(product);
        session.Flush();

        product = new Product(3, "New Product 3", session.Load<Category>(3));
        session.Save(product);
        session.Flush();

Той ще генерира само три вмъквания (няма да извлича категории).

Но когато правите същия набор от действия без промиване след всяко вмъкване, тогава ще извлече прокси асоциации:

        var session = sessionFactory.OpenSession();

        Product product = new Product(1, "New Product", session.Load<Category>(1));
        session.Save(product);

        product = new Product(2, "New Product 2", session.Load<Category>(2));
        session.Save(product);

        product = new Product(3, "New Product 3", session.Load<Category>(3));
        session.Save(product);

        session.Flush();

Генерираният SQL е следният: NHibernate извлича прокси асоциации при вмъкване

Това е много опростен пример, всъщност трябва да вмъкна около 1000 обекта и бих искал да използвам групиране, без да извличам всички свързани обекти.

АКТУАЛИЗАЦИЯ: пълен пример може да бъде изтеглен тук< /силен>


person Serhiy    schedule 07.07.2015    source източник
comment
Използването на инициализатори вместо конструктора за задаване на стойностите има същото поведение?   -  person Najera    schedule 07.07.2015
comment
Najera, да, точно същото. Между другото, мога да споделя много елементарен примерен проект.   -  person Serhiy    schedule 08.07.2015


Отговори (1)


Изглежда, че Flush инициира сортиране на вмъкнати данни. В документацията се казва, че това трябва да подобри производителността с пакетни операции (http://www.nudoq.org/#!/Packages/NHibernate/NHibernate/Environment/F/OrderInserts). За да избегнете подобно поведение добавете

x.SetProperty("order_inserts", "false");

към вашата конфигурация на NHibernate.

person Vuhasty    schedule 15.07.2015