您的位置:首页 > 数据库

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

2012-05-05 15:23 316 查看
前段时间做了一个网站,是在已有的基于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()一行注释掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐