• Nhibernate 延迟加载


    关于Nhibernate 延迟加载必须处在同一个连接,即同一个Session会话。

    1.var policyId = this.policyGroupingEntityRepository.FindSingleByExpression(p => p.PolciyGroup.PolicyId == entity.PolicyId).PolciyGroup.PolicyId;

    2.var policy= this.policyGroupingEntityRepository.FindSingleByExpression(p => p.PolciyGroup.PolicyId == entity.PolicyId);

      new LogicControlContentEntity{

      DefaultPolciyId=policy.PolciyGroup.PolicyId;

    }

    3.查询一个Entity完成之后,中间不加其他entity的查询访问第一个entity的属性是可以的。因为此时还处于第一个entity的连接,如果直接加着其他entity的连接。之后有访问第一个entity的属性。是不可以的因为此时连接已更换成第二个entity的连接。。

    eg 1.var policy= this.policyGroupingEntityRepository.FindSingleByExpression(p => p.PolciyGroup.PolicyId == entity.PolicyId);

    var policyId=policy.policyId

    eg2.var policy= this.policyGroupingEntityRepository.FindSingleByExpression(p => p.PolciyGroup.PolicyId == entity.PolicyId);

     var polciyList =
                    (from p in this.policiesEntityRepository.EntityQueryable where polciyIdList.Contains(p.Id) select p).ToList();

    var policyId=policy.policyId

    eg2是不可以的。

    但是设置isWeb="true" 是可以的,因为此时请求是整个应用程序集的。

      <!--NHibernate Facility-->
        <facility id="nhibernatefacility" type="Castle.Facilities.NHibernateIntegration.NHibernateFacility, Castle.Facilities.NHibernateIntegration" isWeb="true">
          <factory id="AOTTGateWayFactory">
            <settings>
              <item key="connection.provider">NHibernate.Connection.DriverConnectionProvider</item>
              <item key="connection.driver_class">NHibernate.Driver.SqlClientDriver</item>
              <item key="connection.connection_string_name">connectionStrings</item>
              <item key="dialect">NHibernate.Dialect.MsSql2008Dialect</item>
              <item key="show_sql">true</item>
              <item key="command_timeout">120</item>
              <item key="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</item>
              <item key="current_session_context_class">web</item>
              <!--<item key="cache.provider_class">AOTT.GateWay.DatabaseDao.Caches.MongoDbCacheProvider, AOTT.GateWay.DatabaseDao</item>
              <item key="cache.region_prefix" value="mongo.cache"/>
              <item key="cache.use_second_level_cache">true</item>
              <item key="cache.use_query_cache">true</item>
              <item key="cache.use_minimal_puts">false</item>
              <item key="mongodb.connection_string_name">MongoConnectionStrings</item>
              <item key="mongodb.pattern">^AOTT\.GateWay\.Model\.Repository\..+?</item>
              <item key="mongodb.region_prefix">AOTT</item>-->
            </settings>
            <assemblies>
              <assembly>AOTT.GateWay.Model</assembly>
            </assemblies>
          </factory>
        </facility>

    4. 在一个linq 查询的from 子句中想查询policy表中的policyId.可以先将policiesEntity查询出来。如下所示。

    不要再from子句中给PolciyId赋值时在去访问数据库。在大数据量时容易引发异常。此外在判断一个List是否为空时可以使用any.

      var polciyList =
                    (from p in this.policiesEntityRepository.EntityQueryable where polciyIdList.Contains(p.Id) select p).ToList();

     var userEntitlementItemList = (from userId in userIdlist
                                               from controlContent in controlContentList
                                               select
                                                   new UserEntitlementItemEntity{                                                                                                   PolciyId =
                                                               !string.IsNullOrEmpty(entity.PolicyId)
                                                                   ? entity.PolicyId
                                                                   : (polciyList.FirstOrDefault(
                                                                       q => q.Id == controlContent.DefaultPolciyId)
                                                                      ?? defaultPolciy).PolicyId,
                                                       }).ToList();

    如上所示第二种取法是错误的因为现在session已经关闭了。

    5.使用using可以去掉延迟加载。

     public void Create(params TEntity[] entityList)
            {
                if (entityList == null || entityList.All(p => p == null))
                {
                    return;
                }

                using (var session = this.OpenSession())
                {
                    session.Clear();

                    foreach (var entity in entityList.Where(entity => entity != null))
                    {
                        session.Save(entity);
                    }

                    this.SaveSession(session);
                }
            }

  • 相关阅读:
    反转链表
    《Java JDK7 学习笔记》课后练习题1
    《Java JDK7 学习笔记》课后练习题2
    《java JDK7 学习笔记》课后练习题3
    SQL与NoSQL(关系型与非关系型)数据库的区别
    编程中编码的来源及发展
    JDK7学习笔记之基础类型
    《java JDK7学习笔记》之跨平台与路径设置
    《java jdk7学习笔记》之java三大平台
    VS2015安装之后加装SQL SERVER2014的步骤
  • 原文地址:https://www.cnblogs.com/mmnyjq/p/2662534.html
Copyright © 2020-2023  润新知