本文的上下文环境

操作系统: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组合尝试的更多相关文章

  1. Oracle 11g+FluentNHibernate AutoMapping组合尝试

    一次Oracle 11g+FluentNHibernate AutoMapping组合尝试 本文的上下文环境 操作系统:Win7 x64 Ultimate开发工具:Visual Studio 2013 ...

  2. oracle 11g 如何创建、修改、删除list-list组合分区

    Oracle11g在分区方面做了很大的提高,不但新增了4种复合分区类型,还增加了虚拟列分区.系统分区.INTERVAL分区等功能. 9i开始,Oracle就包括了2种复合分区,RANGE-HASH和R ...

  3. PowerDesginer 生成的Oracle 11g 组合触发器代码编译错误(29): PLS-00103

    问题描述: 采用PowerDesigner15针对Oracle 11g 创建物理数据模型,想实现一个字段的自增,采用如下步骤: 1.创建序列,命名为Sequence_1; 2.在自增字段编辑窗口中,选 ...

  4. Oracle 11g新特性

    文章转自网络 Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(I ...

  5. Oracle 11g 物理Dataguard日常操作维护(二)

    Oracle 11g 物理Dataguard日常操作维护(二) 2017年8月25日 14:34 3.3 3.3.1 查看备库进程状态 SYS(125_7)@fpyj123> select pr ...

  6. PL/SQL Developer连接本地Oracle 11g 64位数据库

    转摘:http://www.cnblogs.com/ymj126/p/3712727.html 用于学习,笔记,以备后用. 1.登录PL/SQL Developer 这里省略Oracle数据库和PL/ ...

  7. Oracle 11g RAC 卸载CRS步骤

    Oracle 11g之后提供了卸载grid和database的脚本,可以卸载的比较干净,不需要手动删除crs ##########如果要卸载RAC,需要先使用dbca删除数据库,在执行下面的操作### ...

  8. Oracle 11g中修改默认密码过期天数和锁定次数

    Oracle 11g中修改默认密码过期天数和锁定次数 密码过期的原因一般有两种可能: 一.由于Oracle中默认在default概要文件中设置了"PASSWORD_LIFE_TIME=180 ...

  9. Oracle 11g密码过期问题解决方案

    [问题描述]近日,使用sqlplus登陆短消息Oracle(Oracle培训 )数据库时提示“ORA-28000: 帐号被锁定”.[原因/触发因素]确定是由于oracle11g中默认在default概 ...

随机推荐

  1. and 与 && or 与 || 的差异之处

    其实就是比较他们的优先级 // --------------------// "||" 比 "or" 的优先级高 // 表达式 (false || true)  ...

  2. Linux下压缩mp3文件

    apt-get install lame lame -b 64 a.mp3 b.mp3 lame是压缩mp3的一个小工具 参数 -b 64 是输出文件的采样率64 a.mp3 是源文件 b.mp3 是 ...

  3. 高效能人士必知铁律--note

    偶然看到了<高效能人士 必知铁律>这本书,我比较少看成功学,但是这本书把很多著名的成功学书籍整理出来,有时会让你耳目一新,有些观点尽管是常识,但是却加深了你对它们的理解,比如: 只要在积极 ...

  4. 编程:递归编程解决汉诺塔问题(用java实现)

    Answer: //Li Cuiyun,October 14,2016. //用递归方法编程解决汉诺塔问题 package tutorial_3_5; import java.util.*; publ ...

  5. ASP.NET(转自wiki)

    ASP.NET是由微软在.NET Framework框架中所提供,开发Web应用程序的类库,封装在System.Web.dll文件中,显露出System.Web名字空间,并提供ASP.NET网页处理. ...

  6. zend studio 配置 apache服务器事宜

    安装好 zend studio后,配置 apache服务器时,设置 configuration directory时,需选中 xampp\apache里面的 conf 文件夹,即完整的路径为: *\x ...

  7. etcd第三集

    简单说下golang的etcd接口例子.etcd api有v2(http+json)和v3(grpc)两个版本,目前大家都用v2,所以... v2: https://github.com/coreos ...

  8. C#子类调用基类构造备忘

    using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace First ...

  9. SDDC-SDN-SDS

    SDDCSDNSDS软件定义存储是一个较大的行业发展趋势,这个行业还包括软件定义网络(SDN)和软件定义数据中心(SDDC). SDDC依赖于虚拟化和云计算技术, SDDC的目标是虚拟化数据中心的一切 ...

  10. 技术|程序员必须要学会Google搜索技巧

    程序员必须要学会Google搜索技巧 摘要: 因为Google在我天朝被墙,学FQ请通过Bing进行搜索如何FQGoogle搜索技巧我曾经多次劝我的另一个朋友花10分钟学习一下Google通配符的使用 ...