NHibernate利用Mindscape.NHibernateModelDesigner实现数据库与实体之间的转换及操作

简介: 环境: &nbsp&nbspVisual Studio 2010一、Mindscape.NhibernateModelDesigner安装&nbsp&nbsp在打开VS2010之后,我们可以在“工具”菜单下找到“扩展管理器,搜索:Mindscape NHibernate Model Designer 下载安装即可。安装完成后,在向

环境:
&nbsp&nbspVisual Studio 2010

一、Mindscape.NhibernateModelDesigner安装

&nbsp&nbsp在打开VS2010之后,我们可以在“工具”菜单下找到“扩展管理器,搜索:Mindscape NHibernate Model Designer 下载安装即可。安装完成后,在向项目中添加新项时如果我们拉到最下方我们会看到如下界面:
这里写图片描述
更加具体的操作可以参考:用好VS2010扩展管理器-NHibernate生成

二、根据数据库表结构生成实体并通过实体进行操作

1、添加nhmodel实体

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

2、打开nhmodel实体,根据数据库表生成实体

这里写图片描述
这里写图片描述
&nbsp&nbsp左侧工具栏部分切换到【服务器资源管理器】,连接上你想要获取数据结构的数据库,就会看到展示出来的数据库内容:
这里写图片描述
&nbsp&nbsp拖动你想要的表到设计器主界面,如下图:
这里写图片描述
即可获取到数据库表对应的实体。

3、生成配置文件

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
小注:
&nbsp&nbsp如果不生成配置文件直接运行第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();
                    }
                }
            }

三、根据实体生成数据库表结构并通过实体进行操作

这里写图片描述
两者之间的操作与之前一样
小注:
&nbsp&nbsp

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

这里写图片描述
&nbsp&nbsp如果在主键类型你选择的是Guid
这里写图片描述
&nbsp&nbsp那么此时,你实体类中的主键字段是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
---------------------------
确定   
---------------------------

&nbsp&nbsp那么这种情况应该处理呢?毕竟大多数的主键都是Guid类型的啊,此时需要修改你模型主键的生成规则:
这里写图片描述
在这里修改为guid类型的就可以了

2、选择主键的类型选择int类型的时候:

这里写图片描述
&nbsp&nbsp此时通过实体操作数据是不需要填充主键字段的,你填充了也更新不进去。
这里写图片描述
&nbsp&nbsp本文中有什么不对的地方欢迎支出,谢谢

四、[NHibernate操作文档及demo]

(http://download.csdn.net/detail/xunzaosiyecao/9398186)

作者:jiankunking 出处:http://blog.csdn.net/jiankunking

相关文章
|
6月前
|
存储 缓存 NoSQL
数据库实体与关系模型
【5月更文挑战第16天】本文介绍了数据库模型和UML关系,UML包括依赖、关联(聚合、组合)、泛化和实现4类关系。UML有13种图,分为结构图、行为图和交互图。数据库的基本数据模型包括外模式(用户视图)、概念模式(全局逻辑结构)和内模式(物理存储)。数据模型三要素是数据结构、操作和约束条件。简单易用的缓存数据模型适用于需求灵活、高性能、大数据量且不要求强一致性的场景。
129 5
数据库实体与关系模型
|
6月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
|
前端开发 Java 关系型数据库
【Mybatis-Plus】mybatisplus更新时,实体字段为空,数据库不更新的解决方案
【Mybatis-Plus】mybatisplus更新时,实体字段为空,数据库不更新的解决方案
536 0
|
3月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
83 0
|
5月前
|
存储 关系型数据库 MySQL
MySQL周内训参照1、ER实体关系图与数据库模型图绘制
MySQL周内训参照1、ER实体关系图与数据库模型图绘制
73 1
|
5月前
|
存储 监控 数据管理
数据库原理与应用——简答题练习(数据管理技术发展、数据库主要特征、数据模型、关系模型、实体性之间的关系、DBMS的功能、相关术语解释、数据库系统)
数据库原理与应用——简答题练习(数据管理技术发展、数据库主要特征、数据模型、关系模型、实体性之间的关系、DBMS的功能、相关术语解释、数据库系统)
61 0
|
6月前
|
存储 关系型数据库 MySQL
MySQL技能完整学习列表4、数据库设计——2、数据库规范化(Normalization)——3、实体-关系模型(ER Modeling)
MySQL技能完整学习列表4、数据库设计——2、数据库规范化(Normalization)——3、实体-关系模型(ER Modeling)
128 0
|
Java 关系型数据库 MySQL
Mybatis数据库连接报错:对实体 “characterEncoding“ 的引用必须以 ‘;‘ 分隔符结尾
Mybatis数据库连接报错:对实体 “characterEncoding“ 的引用必须以 ‘;‘ 分隔符结尾
|
存储 JSON 定位技术
4.Cesium中实体Entity的增删改查及性能优化(超详细)
Cesium 作为一个功能强大的 WebGL 三维地球仪库,内置了丰富的三维地图展示能力。在 Cesium 中,我们可以通过 Entity(实体)在三维场景中添加和控制各种三维对象,如点、线、面、模型等。本文将介绍 Cesium 中实体的增删改查操作。
2838 0
|
自然语言处理 算法 NoSQL
手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实体识别、Cypher Cheetsheet详细教学等
手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实体识别、Cypher Cheetsheet详细教学等
手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实体识别、Cypher Cheetsheet详细教学等