一次Oracle 11g+FluentNHibernate AutoMapping组合尝试
本文的上下文环境
操作系统:Win7 x64 Ultimate
开发工具:Visual Studio 2013
一、前言
在以前开发的大多数场景下,使用的开发语言是C#,使用的数据库是Sql Server,这样的组合,必然少不了Entity Framework这样的ORM,自从习惯了Entity Framework,就甩不掉了。这次因为一些历史原因,数据库必须用Oracle,其实,我不太喜欢Oracle,这样的数据库给我的印象是使用起来,无论是安装客户端,配置连接,都太费劲了。
有些事情,你还真得硬着头皮去尝试,你不去做,永远都不会明白。因为我之前的项目Entity Framewor +Sql Server是比较常用的,所以对Entity Framework这样的ORM已经很熟悉了,Entity Framework的DataBase First和Model First,使用的时候,总会遇到一些问题,比如表字段的维护,只能通过设计器,更新,如果表很多的话,设计器显示很慢,更新还经常出错,所以我一直都是用Code First。这次既然是Oracle,我以为很简单,换个引用或连接串就行了(如果以后东西真的这样就好了)。
二、ODP.Net安装
首先搜索一番,知道有个ODP.Net,官方介绍:Oracle Data Provider for .NET (ODP.NET) features optimized ADO.NET data access to the Oracle database. ODP.NET allows developers to take advantage of advanced Oracle database functionality, including Real Application Clusters, XML DB, and advanced security. The data provider can be used with the latest .NET Framework 4.5.1 version。这个ODP.Net其实和微软的System.Data.OracleClient一样,都是提供对Oracle数据库访问的驱动,不过ODP.Net是Oracle自己开发的,可能有些人会以为,项目中换下引用就行了,其实一开始我也这么认为,之后查了些资料才明白,System.Data.OracleClient用的是Oracle的“最小驱动”,使用的时候应该是不需要安装Oracle客户端的,本人没有实践过,使用过的朋友可以帮忙证明下。之后看了System.Data.OracleClient Namespace的介绍:The System.Data.OracleClient namespace is the .NET Framework Data Provider for Oracle.This types in System.Data.OracleClient are deprecated and will be removed in a future version of the .NET Framework. For more information, see Oracle and ADO.NET.这个我看到最重要的是System.Data.OracleClient已deprecated,在将来的 .Net Framework里就看不到了。所以,现在最好是用ODP.Net。
首先要下载ODP.Net,这个要和Oracle服务器端的版本相对应,我用的是Oracle 11g,所以下载了ODAC1120320Xcopy_32bit,我的操作系统是x64的,可以下载32位和64位的,一开始下载了64位的,但是在IIS 7.5里运行网站的时候,提示”Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.",所以我下载了32位的,如果IIS 7.5里的Advanced Setting下Enable 32-Bit Applications设为True,就能正常运行了,64位下如果Enable 32-Bit Applications设为False估计也行,对于ODP.Net的安装,这里面有详细的介绍,正确安装相当重要。
Oracle的这部分完成了,下面就是ORM的选择了,解压ODP.Net后,在odp.net4\odp.net\doc里看到一个readme.htm,打开仔细阅读,看到这条“ODP.NET 11.2.0.3 does not support Code First nor the DbContext APIs.“瞬间就被震住了。之后在Oracle Community看到社区管理员的回答ODP.NET does not support EF Code First yet. For the next ODP.NET release (ODAC 12c Release 3), Oracle plans to support this feature. The plan is to release sometime in 2014.我只感到这大Oracle的反应真够慢的。所以,只能放弃Entity Framework了,听朋友推荐说可以用Fluent NHibernate。
三、Fluent NHibernate配置
所以决定try,在VS2013里引用FluentNHibernate,Install-Package FluentNHibernate -Version 1.4.0,目前是最新版。接下来就是基础搭建了。
由于在继承ClassMap的那种方式下,一个数据库表会写2个实体,感觉太麻烦了,我这里用的是AutoMapping,实体和数据库表一一对应,没有考虑多表关联问题。
首先是个DBContext:
namespace Test.DataAccess.FNhibernate
{
public class DBContext
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
InitializeSessionFactory();
}
return _sessionFactory;
}
} private static void InitializeSessionFactory()
{
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User Id=test;Password=test123;";
var cfg = new DBConfiguration();
_sessionFactory = Fluently.Configure().Database(
OracleClientConfiguration.Oracle10
.ConnectionString(connectionString)
.Provider<NHibernate.Connection.DriverConnectionProvider>()
.Driver<NHibernate.Driver.OracleClientDriver>()
)
.Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<PRODUCT>(cfg).Conventions.Setup(c =>
{
c.Add<PrimaryKeyConvention>();
c.Add<CascadeConvention>();
})))
.BuildSessionFactory();
} public static ISession OpenSession()
{
return SessionFactory.OpenSession();
} /// <summary>
/// 这个暂时用,可能重复
/// </summary>
/// <returns></returns>
public static long GenerateID()
{
long i = ; foreach (byte b in Guid.NewGuid().ToByteArray())
{
i *= ((int)b + );
} string number = String.Format("{0:d9}", (DateTime.Now.Ticks / ) % ); return long.Parse(number);
}
}
}
接下来是一张和数据库表Product相对应的实体:
namespace Test.DataAccess.FNhibernate.DB
{
public class PRODUCT
{
public virtual int PRODUCT_ID { get; set; }
public virtual string PRODUCT_NAME { get; set; }
}
}
接下来是映射关系:
namespace Test.DataAccess.FNhibernate
{
public class DBConfiguration : DefaultAutomappingConfiguration
{
public override bool ShouldMap(Type type)
{
return type.Namespace == "TEST.DataAccess.FNhibernate.DB";
}
public override bool IsId(Member member)
{
string className = member.DeclaringType.Name;
if (member.Name == className + "_ID")
{
return true;
}
return false;
}
}
}
指定主键的生成方式:(这里用的是自己手动赋值,就是在保存的时候,调用DBContext里的GenerateID()方法)
namespace HeLi.DataAccess.FNhibernate
{
public class PrimaryKeyConvention : IIdConvention
{
public void Apply(IIdentityInstance instance)
{
var type = instance.EntityType;
if (type.Name == typeof(PRODUCT).Name)
{
instance.GeneratedBy.Assigned();
}
}
}
}
四、测试
using (var session = DBContext.OpenSession())
{
using (var tran = session.BeginTransaction())
{ var list = session.CreateCriteria(typeof(PRODUCT)).List<PRODUCT>();//取出整个表 var dbUser = session.QueryOver<PRODUCT>().Where(p => p.PORUDCTID = ).SingleOrDefault();
if (dbUser != null)
{
dbUser.PRODUCT_NAME = "镜子";
session.SaveOrUpdate(dbUser);
} var product = new PRODUCT();
product.PRODUCT_ID = DBContext.GenerateID();
product.PRODUCT_NAME = "盒子";
session.Save(product);
tran.Commit(); }
}
ps:由于是事后之作,没有来得及整理demo,没有完整代码下载,Hope it can help you.
引用阅读:
http://www.oracle.com/technetwork/topics/dotnet/index-085163.html
http://dba.stackexchange.com/questions/44470/why-oracle-sql-developer-does-not-need-oracle-client
http://msdn.microsoft.com/en-us/library/system.data.oracleclient(v=vs.110).aspx
http://www.thebestcsharpprogrammerintheworld.com/blogs/connect-to-an-oracle-database-without-an-oracle-client.aspx http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html
一次Oracle 11g+FluentNHibernate AutoMapping组合尝试的更多相关文章
- Oracle 11g+FluentNHibernate AutoMapping组合尝试
一次Oracle 11g+FluentNHibernate AutoMapping组合尝试 本文的上下文环境 操作系统:Win7 x64 Ultimate开发工具:Visual Studio 2013 ...
- oracle 11g 如何创建、修改、删除list-list组合分区
Oracle11g在分区方面做了很大的提高,不但新增了4种复合分区类型,还增加了虚拟列分区.系统分区.INTERVAL分区等功能. 9i开始,Oracle就包括了2种复合分区,RANGE-HASH和R ...
- PowerDesginer 生成的Oracle 11g 组合触发器代码编译错误(29): PLS-00103
问题描述: 采用PowerDesigner15针对Oracle 11g 创建物理数据模型,想实现一个字段的自增,采用如下步骤: 1.创建序列,命名为Sequence_1; 2.在自增字段编辑窗口中,选 ...
- Oracle 11g新特性
文章转自网络 Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(I ...
- Oracle 11g 物理Dataguard日常操作维护(二)
Oracle 11g 物理Dataguard日常操作维护(二) 2017年8月25日 14:34 3.3 3.3.1 查看备库进程状态 SYS(125_7)@fpyj123> select pr ...
- PL/SQL Developer连接本地Oracle 11g 64位数据库
转摘:http://www.cnblogs.com/ymj126/p/3712727.html 用于学习,笔记,以备后用. 1.登录PL/SQL Developer 这里省略Oracle数据库和PL/ ...
- Oracle 11g RAC 卸载CRS步骤
Oracle 11g之后提供了卸载grid和database的脚本,可以卸载的比较干净,不需要手动删除crs ##########如果要卸载RAC,需要先使用dbca删除数据库,在执行下面的操作### ...
- Oracle 11g中修改默认密码过期天数和锁定次数
Oracle 11g中修改默认密码过期天数和锁定次数 密码过期的原因一般有两种可能: 一.由于Oracle中默认在default概要文件中设置了"PASSWORD_LIFE_TIME=180 ...
- Oracle 11g密码过期问题解决方案
[问题描述]近日,使用sqlplus登陆短消息Oracle(Oracle培训 )数据库时提示“ORA-28000: 帐号被锁定”.[原因/触发因素]确定是由于oracle11g中默认在default概 ...
随机推荐
- Python通用序列操作
1.序列概览 1.数据结构 序列.容器 Python中最基本的数据结构是序列,其有索引(从左到右第一个索引为0,从右到左第一个索引为-1). Python包含6中内建的序列: 列表 元组 字符串 Un ...
- select,poll,epoll区别
select:忙轮询,一直在轮询,效率跟链接数成反比,资源限制 poll:轮询,不用一直轮询,有事件触发时轮询,资源限制 epoll:有事件触发时直接通知复杂度O(1)
- php操作Memcache
一.memcache基本的介绍 是一个高性能的分布式内存对象缓存系统. 和mysql比较,进行理解memcache (1)该软件是一个c/s架构, (2)mysql的数据是存储到哪里的?是存储到磁盘里 ...
- ubuntu 安装mongodb
安装 mongodb sudo apt-get install mongodb 创建目录(放在单独文件夹中) mkdir data/aa 在目录外面启动,端口为27017 mongod -dbpath ...
- app打包(同步发生冲突)
1:打包步骤: 1:桌面建立一个文件夹,名字叫keystore 2:点击build下面的 ,如下: 3:会出现如下界面: 4:下一步: 5:如果有keystore,请点击 choose exi ...
- (转) Artificial intelligence, revealed
Artificial intelligence, revealed Yann LeCunJoaquin Quiñonero Candela It's 8:00 am on a Tuesday morn ...
- CSS定位position
position选项来定义元素的定位属性,选项有5个可选值:static.relative.absolute.fixed.inherit 属性值为relative.absolute.fixed时top ...
- 1、SQL可搜索可排序可分页存储过程, 2、范围内的随机时间 适用于sql 2008以上
-- ============================================= -- Author: 蜘蛛王 -- Create date: 2015-10-29 -- Descri ...
- Jeesite的cahche工具类
本CacheUtils主要是基于shiro的cache进行处理. 其他选择: 类似的我们可以选择java cache ,spring cahche等方案. 再进一步 ...
- IOS-UITextField键盘不隐藏问题
这久在手机也页面做了注册功能,需要很多的UITextField,有些是手动输入文字的,有些是点击下拉框选择的,这就出现了当点击下拉框时,就需要将键盘隐藏. - (void)textFieldDidBe ...