关于NHibernate下Access的使用以及NHibernate下SQL到Access的迁移

    前段时间做了一个网站,是在已有的基于NHibernate和Castle ActiveRecord的平台上做的,由于原平台是基于SQL 2005 开发的,所以这次就没考虑数据库的问题,做完之后才得知说是在虚拟主机上运行的,而且该虚拟主机不支持SQL数据库,只能使用Access。一下子懵了,虽然NHibernate支持N多数据库的平滑切换,但现在使用Access的真的不太多见,NHibernate早就从主类库中把Access的支持给剔除了。再说了那么多数据表和基础数据不可能一个一个搬一遍吧?

    车到山前必有路,前段时间研究过NHibernate下的Access支持问题,虽然没能成功,但方向还是有的。接下来就一步一步走一遍吧:

    所用版本说明:NHibernate:3.1.0.4000,Castle.ActiveRecord:3.0.0.138

    第一步:下载NHibernate.JetDriver,由于网络上的版本都是早期的,所以我下载后又在NHibernate3.1版本上进行了编译,不然版本不兼容会报错。

    第二步:更新配置文件(web.config)为Access配置,如下图所示:

<?xml version="1.0"?>
<configuration>
	<configSections>
		<section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
	</configSections>
    <activerecord isWeb= "true" >
		<config>
            <add key="connection.driver_class" value="NHibernate.JetDriver.JetDriver, NHibernate.JetDriver"/>
            <add key="dialect" value="NHibernate.JetDriver.JetDialect, NHibernate.JetDriver"/>
            <add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
            <add key="connection.connection_string" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=App_Data/Test.mdb"/>
            <add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle"/>
            <add key="connection.release_mode" value="on_close"/>
    </config>
	</activerecord>
	<appSettings>……
    说明: connection.connection_string 中的Data Source指向的是Access数据库文件(提前建好一个空Access库即可,在第三步中我们会让NHibernate自动将数据表创建到这个空库中),建议放在App_Data目录下即可,JetDriver会自动映射到网站的根目录。

    第三步:让NHibernate自动建表到空的Access数据库。

    1)修改文件Global.asax

    void Application_Start(object sender, EventArgs e)
    {
        //在应用程序启动时运行的代码
        //初始化ActiveRecord→NHibernate
        XmlConfigurationSource configSource = ConfigurationManager.GetSection("activerecord") as XmlConfigurationSource;

        ActiveRecordStarter.Initialize(configSource, 
            /*↓数据库映射实体↓*/
            typeof(RollingPic),
            typeof(SubSite),
            typeof(SubCategory),
            typeof(SubContent),
            typeof(MsgBoard),
            typeof(FriendLink),
            typeof(SignUpMsg)
            );

        //根据初始化的实体,自动生成数据表(生成数据表后请屏蔽该行代码)
        ActiveRecordStarter.CreateSchema();
    }


    2)创建一个Web页面,在Page_Load事件中随便new一个实体并Save,配置没什么问题的话,即可触发上面的CreateSchema()事件并自动在Access空库中创建所有映射实体的数据表。建议这样建表,因为发现通过SQL到Access自动导入数据并建表的方式创建的数据表,其字段类型、长度、索引、主键等和原表相去甚远。但为了使其能够自动创建字段类型、长度、主键等完全符合的数据表,在创建实体的时候就需要尽可能的把实体属性写全面(这里只针对ActiveRecord),如:

    /// <summary>
    /// 用户信息实体,映射数据表:xt_user。
    /// </summary>
    [Serializable]
    [ActiveRecord("xt_user", DynamicInsert = true, DynamicUpdate = true)]
    public class UserEntity : ActiveRecordValidationBase
    {
        public static readonly ILog Log = LogManager.GetLogger(typeof(UserEntity));

        #region Public Properties(实体公开属性)

        /// <summary>
        /// 主键
        /// </summary>
        [PrimaryKey(PrimaryKeyType.Native)]
        public long Id
        {
            get;
            set;
        }

        /// <summary>
        /// 登录账号
        /// </summary>
        [Property(SqlType = "nvarchar(30)", NotNull = true, Unique = true)]//Unique:唯一索引
        [ValidateNonEmpty("登录账号:不能为空")]
        [ValidateIsUnique("登录账号:已被使用!")]
        [ValidateLength(0, 30, "登录账户:最大长度30")]
        public string UserLoginZh
        {
            get;
            set;
        }

        /// <summary>
        /// 姓名
        /// </summary>
        [Property(SqlType = "nvarchar(20)")]
        [ValidateLength(0, 20, "姓名:最大长度20")]
        public string UserName
        {
            get;
            set;
        }

    3)从SQL Server导入数据到Access(这个就不多说了,需要提醒的是SQLserver 2005需要专业版才能顺利把数据导入到Access,Express版没有相应导入功能)。

    至此,Access的支持已经大功告成了,别忘了修改下Global.asax,将CreateSchema()一行注释掉。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值