NHibernate 插入具有代理关联的实体而不获取

NHibernate insert entity with proxy associations without fetching

假设有类别表和产品表。产品 已分配 ID 并引用类别:

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 如下:

这是一个非常简单的示例,实际上我需要插入大约 1000 个实体并且想使用批处理而不获取所有相关实体。

更新:可以下载完整示例here

看起来 Flush 开始对插入的数据进行排序。文档说这应该可以提高批处理操作的性能 (http://www.nudoq.org/#!/Packages/NHibernate/NHibernate/Environment/F/OrderInserts)。 为避免此类行为,请添加

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

到您的 NHibernate 配置。