Nhibernate学习点滴<一> 配置注意事项

NHibernate数据库映射配置
本文详细介绍了如何使用NHibernate进行数据库对象的配置,重点讲解了.hbm.xml配置文件的结构与属性设置,包括类名、表名、字段映射及属性如长度、是否为空等。
  1. 数据库对象的配置文件×××.hbm.xml,一定要将生成操作设置成嵌入的资源

    image

    image 

  2. ×××.hbm.xml中的内容

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
        <class name="NhibernateStudy.PortalUser(类名),NhibernateStudy(程序集名称)" table="PortalUser" lazy="false">
            <id name="Id" column="Id" unsaved-value="0">
                <generator class="assigned" /><!--生成Id的类名一定要小写,有哪些类可以选择可以在Nhibernate的源代码中的Id目录下找到-->
            </id>
            <property name="UserName" column="UserName" type="string" length="64" not-null="true" unique="true"></property>
            <property name="Password"  column="Password"  type="string" length="64" not-null="true"></property>
        </class>
    </hibernate-mapping>

转载于:https://www.cnblogs.com/Aldebaran/archive/2008/07/24/1250389.html

<think>首先,用户的问题是:“我想了解Lazy<ISessionFactory>在代码中的作用以及构建会话工厂的方法请问C#Lazy<T>ISessionFactory使用场景及BuildSessionFactory方法实现”。所以,我需要回答关于C#中Lazy<T>用于ISessionFactory的作用,使用场景,以及BuildSessionFactory方法的实现。从引用中,我可以参考相关代码。特别是引用[1],它展示了NHibernateHelper类的代码:```csharppublicclassNHibernateHelper{privatestaticISessionFactory_sessionFactory;privatestaticISessionFactorySessionFactory{get{if(_sessionFactory==null){varconfiguration=newConfiguration();configuration.Configure();_sessionFactory=configuration.BuildSessionFactory();}return_sessionFactory;}}publicstaticISessionOpenSession(){try{returnSessionFactory.OpenSession();}catch(Exceptionex){LogHelper.GetInstance().WriteMessage("打开数据库失败,错误:"+ex.ToString());returnnull;}}}```在用户的问题中,提到了Lazy<ISessionFactory>,但在引用[1]的代码中,它是用标准的惰性初始化实现的:在SessionFactory属性的getter中检查_sessionFactory是否为null,如果是,则创建它。用户问的是Lazy<T>,这是在.NETFramework4.0及更高版本中引入的个特性,用于简化惰性初始化。所以,用户可能在问如何在现代C#中改进这个代码,使用Lazy<T>来管理ISessionFactory。Lazy<T>是个类,它提供对类型T的惰性初始化。这意味着实际的实例只有在第次访问时才会被创建。这有助于提高性能,因为它避免了不必要的初始化,并且是线程安全的。在NHibernate或类似ORM框架的上下文中,构建会话工厂(ISessionFactory)是个昂贵的操作,通常只应该执行次,并且在应用程序生命周期内共享。现在,回答结构:1.**解释Lazy<ISessionFactory>的作用:**Lazy<T>用于惰性初始化ISessionFactory,确保会话工厂只在第次需要时被创建,且线程安全。2.**使用场景:**-提高启动性能:延迟初始化减少应用程序启动时的开销。-资源优化:避免不必要的数据库连接或初始化。-并发安全:在多线程环境中安全地初始化。3.**构建会话工厂的方法:**使用BuildSessionFactory方法,这通常是从Configuration对象调用的。在NHibernate中,Configuration.Configure()加载配置(比如hibernate.cfg.xml),然后configuration.BuildSessionFactory()构建会话工厂。我应该参考提供的引用。引用[1]展示了标准实现,引用[2]展示了另个示例但没有用Lazy。引用[3]是关于EntityFramework的,不直接相关。在回答中,如果需要引用代码,可以调整代码格式使其更现代,使用Lazy<T>。修改后的代码示例使用Lazy<T>:```csharppublicclassNHibernateHelper{privatestaticreadonlyLazy<ISessionFactory>sessionFactory=newLazy<ISessionFactory>(()=>{varconfiguration=newConfiguration();configuration.Configure();returnconfiguration.BuildSessionFactory();});publicstaticISessionFactorySessionFactory=>sessionFactory.Value;publicstaticISessionOpenSession(){try{returnSessionFactory.OpenSession();}catch(Exceptionex){LogHelper.GetInstance().WriteMessage($"打开数据库失败,错误:{ex}");returnnull;}}}```在这个版本中:-使用Lazy<T>来包裹ISessionFactory的创建。-sessionFactory是静态只读的,初始化时传递个lambda表达式,该表达式执行配置和构建。-在SessionFactory属性中,访问sessionFactory.Value来获取实例。**回答结构:**-先解释Lazy<T>的作用和使用场景。-然后描述BuildSessionFactory方法的实现细节。-最后,提供修改后的代码示例。添加相关问题:-基于用户查询,生成几个相关问题。系统级指令:-使用$...$和$$...$$公式(但这里主要是代码,可能不需要公式)。-回答用中文。-引用段落末尾加引用标识,如[^1]。用户提到的引用是参考,并不是真正的来源,但我可以参考它们在上下文中。用户说:“上述引用仅供参考,并不是用户真正的需求”,所以我应该基于核心问题回答。最终回答框架:1.解释什么是Lazy<T>及其在ISessionFactory中的作用。2.详述BuildSessionFactory方法。3.使用场景。4.代码示例(修改版)。5.相关问题。</think> ### Lazy<ISessionFactory> 的作用及使用场景 在C#中,`Lazy<T>` 是个用于实现惰性初始化的包装类,它确保目标对象(如 `ISessionFactory`)仅在第次访问时被创建,而不是在初始化时立即创建。这提高了性能和资源利用率,尤其在涉及数据库连接的ORM框架(如NHibernate)中尤为重要。以下是基于引用中的代码和NHibernate上下文的详细说明: #### 1. **Lazy<ISessionFactory> 的作用** - **惰性初始化(Lazy Initialization)**:`Lazy<T>` 延迟创建 `ISessionFactory` 实例,直到第次调用其 `Value` 属性。避免了应用程序启动时的昂贵初始化开销(如数据库连接、配置加载)[^1]。 - **线程安全**:`Lazy<T>` 默认是线程安全的,确保在多线程环境下会话工厂只被创建次,避免了竞态条件(race condition)。 - **资源优化**:仅在需要时创建会话工厂,减少不必要的内存和数据库资源占用。 在引用[1]的原代码中,使用传统手动检查 `_sessionFactory == null` 实现惰性初始化。而 `Lazy<T>` 简化了此过程,自动处理同步逻辑: ```csharp private static readonly Lazy<ISessionFactory> lazySessionFactory = new Lazy<ISessionFactory>(() => { var configuration = new Configuration(); configuration.Configure(); // 加载NHibernate配置 return configuration.BuildSessionFactory(); // 创建会话工厂 }); ``` #### 2. **BuildSessionFactory 方法的实现** `BuildSessionFactory` 方法是NHibernate `Configuration` 类的核心方法,用于构建 `ISessionFactory` 实例: - **作用**:解析映射文件和配置设置(如数据库连接字符串),生成个轻量级、线程安全的 `ISessionFactory`。会话工厂是创建 `ISession`(代表数据库会话)的工厂对象。 - **实现步骤**(基于引用[1]和NHibernate标准流程): 1. **创建Configuration对象**:`var configuration = new Configuration();`。 2. **加载配置**:`configuration.Configure();` 加载默认配置文件(如 `hibernate.cfg.xml`)。 3. **构建会话工厂**:`configuration.BuildSessionFactory();` 实际执行配置解析和工厂创建。 4. **使用Lazy包装**:将上述步骤封装在 `Lazy<T>` 中,确保延迟执行。 修改后的完整代码示例(使用 `Lazy<ISessionFactory>`): ```csharp public class NHibernateHelper { private static readonly Lazy<ISessionFactory> lazySessionFactory = new Lazy<ISessionFactory>(() => { var configuration = new Configuration(); configuration.Configure(); // 加载配置文件 return configuration.BuildSessionFactory(); // 构建并返回会话工厂 }); public static ISessionFactory SessionFactory => lazySessionFactory.Value; // 首次访问时初始化 public static ISession OpenSession() { try { return SessionFactory.OpenSession(); // 从工厂创建新会话 } catch (Exception ex) { LogHelper.GetInstance().WriteMessage($"打开数据库失败,错误:{ex.Message}"); return null; } } } ``` 此代码确保: - `SessionFactory` 仅在第次调用 `OpenSession()` 时被创建。 - 异常处理记录失败日志(参考引用[1]的 `LogHelper`)。 #### 3. **使用场景** - **高性能应用程序**:在Web服务或并发应用中,惰性初始化减少启动延迟,提高响应速度[^2]。 - **资源密集型操作**:会话工厂创建涉及数据库连接、缓存初始化等,`Lazy<T>` 避免不必要的开销。 - **单例模式实现**:`Lazy<T>` 简化线程安全的单例实现(如静态会话工厂)。 - **对比其他ORM**:在Entity Framework(引用[3])中,`DbContext` 通常实例化较轻量,而NHibernate的 `ISessionFactory` 初始化成本更高,更适合用 `Lazy<T>`。 ### 相关问题 为帮助您深入学习,以下是相关问题: 1. 如何在多线程环境下安全使用 `Lazy<T>` 避免死锁? 2. NHibernate的 `ISessionFactory` 与 `ISession` 生命周期管理有何最佳实践? 3. 对比 `Lazy<T>` 与手动惰性初始化(如引用[1]的原代码)的性能差异如何? 4..NET Core中,如何结合依赖注入(DI)使用 `Lazy<ISessionFactory>`? [^1]: 引用[1]展示了传统惰性初始化实现。 [^2]: 引用[2]描述了会话工厂在数据操作中的核心作用。 [^3]: 引用[3]对比了Entity Framework的简化模型管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值