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

标签 performance nhibernate proxy

假设有类别和产品表。并且产品已分配 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如下: NHibernate fetching proxy associations on insert

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

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

最佳答案

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

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

到您的 NHibernate 配置。

关于performance - NHibernate插入具有代理关联的实体而不获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31267984/

相关文章:

python - 如何有效地将行附加到 pandas DataFrame

c# - 对选择合适的 ORM 感到困惑?

configuration - Tinyproxy 不转发请求。从 <IP> 获取未经授权的连接

android - 如何在 Library Project 中导入包和类文件

c# - 为什么在数据库的每个数据请求之间休眠可以让我获得更好的性能?

nhibernate - 将复合键映射到两个外键

visual-studio - 为什么在运行我的应用程序时会遗漏一些引用?

java - 带有代理的 Java 中的 HTTP 基本身份验证

git - 如何从命令行将 git config 变量设置为空值

java - 有效地搜索连续日期段的列表