NHibernate利用Mindscape.NHibernateModelDesigner实现数据库与实体之间的转换及操作
环境:
  Visual Studio 2010
一、Mindscape.NhibernateModelDesigner安装
  在打开VS2010之后,我们能够在“工具”菜单下找到“扩展管理器,搜索:Mindscape NHibernate Model Designer 下载安装就可以。安装完毕后,在向项目中加入新项时假设我们拉到最下方我们会看到例如以下界面:
更加详细的操作能够參考:用好VS2010扩展管理器-NHibernate生成
二、依据数据库表结构生成实体并通过实体进行操作
1、加入nhmodel实体
2、打开nhmodel实体,依据数据库表生成实体
  左側工具栏部分切换到【server资源管理器】,连接上你想要获取数据结构的数据库。就会看到展示出来的数据库内容:
  拖动你想要的表到设计器主界面。例如以下图:
就可以获取到数据库表相应的实体。
3、生成配置文件
小注:
  假设不生成配置文件直接执行第4步中代码,会报出以下的错误:
未处理 NHibernate.Cfg.HibernateConfigException
HResult=-2146232832
Message=An exception occurred during configuration of persistence layer.
Source=NHibernate
StackTrace:
在 NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader, Boolean fromAppSetting)
在 NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader)
在 NHibernate.Cfg.Configuration.Configure(XmlReader textReader)
在 NHibernate.Cfg.Configuration.Configure(String fileName, Boolean ignoreSessionFactoryConfig)
在 NHibernate.Cfg.Configuration.Configure(String fileName)
在 NHibernate.Cfg.Configuration.Configure()
在 DataBaseToEntity.ConfigurationHelper.CreateConfiguration() 位置 C:\Users\JianKunKing\Desktop\NHibernateStudy\NHibernateStudy\DataBaseToEntity\NHibernateModel1.cs:行号 20
在 DataBaseToEntity.DataBaseToEntityForm1..ctor() 位置 C:\Users\JianKunKing\Desktop\NHibernateStudy\NHibernateStudy\DataBaseToEntity\DataBaseToEntityForm1.cs:行号 20
在 DataBaseToEntity.Program.Main() 位置 C:\Users\JianKunKing\Desktop\NHibernateStudy\NHibernateStudy\DataBaseToEntity\Program.cs:行号 18
在 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading.ThreadHelper.ThreadStart()
InnerException: System.IO.FileNotFoundException
HResult=-2147024894
Message=未能找到文件“C:\Users\JianKunKing\Desktop\NHibernateStudy\NHibernateStudy\DataBaseToEntity\bin\Debug\hibernate.cfg.xml”。
Source=mscorlib
FileName=C:\Users\JianKunKing\Desktop\NHibernateStudy\NHibernateStudy\DataBaseToEntity\bin\Debug\hibernate.cfg.xml
StackTrace:
在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
在 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize)
在 System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy)
在 System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
在 System.Xml.XmlTextReaderImpl.OpenUrlDelegate(Object xmlResolver)
在 System.Threading.CompressedStack.runTryCode(Object userData)
在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
在 System.Threading.CompressedStack.Run(CompressedStack compressedStack, ContextCallback callback, Object state)
在 System.Xml.XmlTextReaderImpl.OpenUrl()
在 System.Xml.XmlTextReaderImpl.Read()
在 System.Xml.XmlTextReader.Read()
在 System.Xml.XmlCharCheckingReader.Read()
在 System.Xml.XsdValidatingReader.Read()
在 System.Xml.XPath.XPathDocument.LoadFromReader(XmlReader reader, XmlSpace space)
在 System.Xml.XPath.XPathDocument..ctor(XmlReader reader, XmlSpace space)
在 System.Xml.XPath.XPathDocument..ctor(XmlReader reader)
在 NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader, Boolean fromAppSetting)
InnerException:
4、通过实体来操作数据库:
//获取映射关系及配置
ISessionFactory sessionFactory = ConfigurationHelper.CreateConfiguration().Configure().BuildSessionFactory();
//此处新增
TbNHibernate entity = new TbNHibernate();
entity.UserName = "UserName1";
entity.UserPwd = "UserPwd1";
using (ISession session = sessionFactory.OpenSession())
{
try
{
var a = session.Save(entity);
session.Flush();
}
catch (Exception ee)
{
MessageBox.Show(ee.ToString());
}
}
//部分字段更新
using (ISession session = sessionFactory.OpenSession())
{
ITransaction trans = session.BeginTransaction();
try
{
string sql = " update tb_NHibernate set userPWD=" + value + " where id='" + id + "'";
ISQLQuery Query = session.CreateSQLQuery(sql).AddEntity(typeof(TbNHibernate));
Query.ExecuteUpdate();
session.Flush();
trans.Commit();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
IsSuccess = false;
trans.Rollback();
}
finally
{
if (session != null)
{
session.Clear();
}
}
}
三、依据实体生成数据库表结构并通过实体进行操作
两者之间的操作与之前一样
小注:
  
1、假设在选择主键生成方式的时候选择了HiLo选项
,那么生成表的主键字段是uniqueidentifier类型的:
CREATE TABLE [dbo].[DataBaseToEntity1](
[Id] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](max) NOT NULL,
[Code] [nvarchar](max) NOT NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
  假设在主键类型你选择的是Guid
  那么此时。你实体类中的主键字段是Guid类型的,假设你通过Guid.NewGuid()给你主键字段赋值会报出例如以下错误:
---------------------------
---------------------------
NHibernate.HibernateException: error performing isolated work ---> System.FormatException: GUID 应包括带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。
在 System.Guid.TryParseGuidWithNoStyle(String guidString, GuidResult& result)
在 System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)
在 System.Guid..ctor(String g)
在 NHibernate.Type.GuidType.Get(IDataReader rs, Int32 index)
在 NHibernate.Id.TableGenerator.DoWorkInCurrentTransaction(ISessionImplementor session, IDbConnection conn, IDbTransaction transaction
在 NHibernate.Engine.TransactionHelper.Work.DoWork(IDbConnection connection, IDbTransaction transaction)
在 NHibernate.Transaction.AdoNetTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, Boolean transacted)
--- 内部异常堆栈跟踪的结尾 ---
在 NHibernate.Transaction.AdoNetTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, Boolean transacted)
在 NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.ExecuteWorkInIsolation(ISessionImplementor session, IIsolatedWork work, Boolean transacted)
在 NHibernate.Engine.Transaction.Isolater.DoIsolatedWork(IIsolatedWork work, ISessionImplementor session)
在 NHibernate.Engine.TransactionHelper.DoWorkInNewTransaction(ISessionImplementor session)
在 NHibernate.Id.TableGenerator.Generate(ISessionImplementor session, Object obj)
在 NHibernate.Id.TableHiLoGenerator.Generate(ISessionImplementor session, Object obj)
在 NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
在 NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
在 NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
在 NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
在 NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
在 NHibernate.Impl.SessionImpl.Save(Object obj)
在 DataBaseToEntity.DataBaseToEntityForm1.button1_Click(Object sender, EventArgs e) 位置 C:\Users\JianKunKing\Desktop\NHibernateStudy\NHibernateStudy\DataBaseToEntity\DataBaseToEntityForm1.cs:行号 31
---------------------------
确定
---------------------------
  那么这样的情况应该处理呢?毕竟大多数的主键都是Guid类型的啊,此时须要改动你模型主键的生成规则:
在这里改动为guid类型的就能够了
2、选择主键的类型选择int类型的时候:
  此时通过实体操作数据是不须要填充主键字段的,你填充了也更新不进去。
  本文中有什么不正确的地方欢迎支出,谢谢
四、[NHibernate操作文档及demo]
(http://download.csdn.net/detail/xunzaosiyecao/9398186)
作者:jiankunking 出处:http://blog.csdn.net/jiankunking
NHibernate利用Mindscape.NHibernateModelDesigner实现数据库与实体之间的转换及操作的更多相关文章
- Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- spring+mybatis利用interceptor(plugin)兑现数据库读写分离
使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是"地位相当"的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这 ...
- 利用EntityFramework获得双色球数据库
原文 利用EntityFramework获得双色球数据库 双色球想必大家都很熟悉了,尽管屡买屡不中,但还是会买.以前就想过利用双色球的走势图得到双色球的数据库,至于得到数据库干什么倒没想过,不过对以往 ...
- Dapper.Contrib拓展及数据库生成实体
1.关于Dapper.Contrib Dapper.Contrib是Dapper的一个拓展类库,Dapper是一个轻量级ORM框架,这个不了解的请自行收集资料,本文主要讲讲,数据库生成实体,并通过实体 ...
- 利用mybatis generator实现数据库之间的表同步
项目背景: 项目需要对两个服务器上的表进行同步,表的结构可能不一样.比如服务器A上的表i同步数据到服务器B上的表j,i和j的结构可能不一样,当然大部分字段是一样的.项目看起来很简单,网上一搜也是很多, ...
- 利用反射跟自定义注解拼接实体对象的查询SQL
前言 项目中虽然有ORM映射框架来帮我们拼写SQL,简化开发过程,降低开发难度.但难免会出现需要自己拼写SQL的情况,这里分享一个利用反射跟自定义注解拼接实体对象的查询SQL的方法. 代码 自定义注解 ...
- 利用oneproxy部署mysql数据库的读写分离
实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 oneproxy-rhel ...
- 利用xtrabackup备份mysql数据库
利用xtrabackup备份mysql数据库 一.安装1.直接下载二进制文件wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2. ...
- VS2015 +EF6 连接MYSQL数据库生成实体
VS2015 +EF6 连接MYSQL数据库生成实体 已安装软件:VS2015 XAMPP Control Panel(Mysql服务器) ...
随机推荐
- android 研究的环境搭建、高效工具、网站资源
================= 2015 年 10 月 14 号 更新 著名的android开源社区xda有一个帖子,详细描述了android开发和研究环境的初始搭建过程: http://for ...
- 信号槽库:sigslot.h和sigc++使用
用qt的知道,qt有方便简单的信号槽机制,但需要专门的qt工具处理. 如果想直接使信号槽就可以使用sigslot库,或者sigc++库,或者boost中的signals,这里介绍sigslot和sig ...
- Jquery操作属性选择器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- c++和G++的区别
今天被g++坑死了.. 网上找了一段铭记:引自 http://www.cnblogs.com/dongsheng/archive/2012/10/22/2734670.html 1.输出double类 ...
- AppScan入门工作原理详解
AppScan,即 AppScan standard edition.其安装在 Windows 操作系统上,可以对网站等 Web 应用进行自动化的应用安全扫描和测试. Rational AppScan ...
- CodeForces - 985F Isomorphic Strings
假如两个区间的26的字母出现的位置集合分别是 A1,B1,A2,B2,....., 我们再能找到一个排列p[] 使得 A[i] = B[p[i]] ,那么就可以成功映射了. 显然集合可以直接hash, ...
- POJ 1990 MooFest(zkw线段树)
[题目链接] http://poj.org/problem?id=1990 [题目大意] 给出每头奶牛的位置和至少要多少分贝的音量才能听到谈话 现在求奶牛两两交流成功需要的分贝*距离的总和. [题解] ...
- jQuery插件开发 总结
一般来说,jQuery插件的开发分为两种:一种是挂在jQuery命名空间下的全局函数,也可称为静态方法:另一种是jQuery对象级别的方法,即挂在jQuery原型下的方法,这样通过选择器获取的jQue ...
- 使用 SQL Server 的 uniqueidentifier 字段类型
原文:使用 SQL Server 的 uniqueidentifier 字段类型 SQL Server 自 2008 版起引入了 uniqueidentifier 字段,它存储的是一个 UUID, 或 ...
- 一次快速改写 SQL Server 高效查询的范例
原文:一次快速改写 SQL Server 高效查询的范例 最近線上系統突然出現匯出資料超過 10 筆時,查詢逾時的狀況,在仔細查找之後. 發現了問題原因,透過應用端與數據端兩邊同時調整,將查詢的效率提 ...