一次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概 ...
随机推荐
- 因特网服务的类型(协议),目前最流行的类型是 http协议
在学习超链接中,在HTML上点击QQ图标时会 自动的启动自己本地QQ客户端,其方法是使用了超链协议 一些常用协议如下: file资源是本地计算机上的文件.格式file:/// ftp通过 FTP访问资 ...
- shiro中的filterChainDefinitions
anno:对所有请求放行 logout:立刻退出当前登录用户,并重定向到指定redirectUrl,如果没有指定redirectUrl,貌似是默认重定向到登录页面. authc:当访问需要通过权限验证 ...
- Linq to Entity经验:表达式转换
http://www.cnblogs.com/ASPNET2008/archive/2012/10/27/2742434.html 最近一年的项目,我主要负责一些小型项目(就是指企业内部的小项目),在 ...
- Java中事务的概念
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言: 在学习事务确实有不少弯路,那么今天笔者就用例子讲解一下事务,让初学者少走一些弯路. [回顾事务]问:什么是事务? 答:用专业术语来说事 ...
- iscsi与multipath
2016-10-01/21:07:24 http://www.cnblogs.com/wuchanming/p/4019660.htmlhttp://czmmiao.iteye.com/blog/20 ...
- [ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.3.1:
security-sdk-1.0.jar已经存在于D:/secServerSDK-test/src/main/resources/lib下 报错如下: xxxxxx@xxxxxxxx /d/secSe ...
- Saying that Java is nice because it works on every OS is like saying that anal sex is nice because it works on every gender.
Saying that Java is nice because it works on every OS is like saying that anal sex is nice because i ...
- eclipse的常用快捷键
Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切, ...
- B2B商城网站前端开发
最近在时间很忙,在弄一个B2B商城,运用到的easyUI+javaWEB(maven)+JQuery+Scss+JavaScript+其他框架(sea.js模块化等),我负责前端这块:后期的重要的前端 ...
- day1作业--登录入口
作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...