環境:
  Visual Studio 2010
一、Mindscape.NhibernateModelDesigner安裝
  在打開VS2010之后,我們能夠在“工具”菜單下找到“擴展管理器,搜索:Mindscape NHibernate Model Designer 下載安裝就可以。安裝完畢后,在向項目中加入新項時假設我們拉到最下方我們會看到例如以下界面:
更加詳細的操作能夠參考:用好VS2010擴展管理器-NHibernate生成
二、依據數據庫表結構生成實體并通過實體進行操作
1、加入nhmodel實體
2、打開nhmodel實體,依據數據庫表生成實體
  左側工具欄部分切換到【server資源管理器】,連接上你想要獲取數據結構的數據庫。就會看到展示出來的數據庫內容:
  拖動你想要的表到設計器主界面。例如以下圖:
就可以獲取到數據庫表相應的實體。
3、生成配置文件
小注:
  假設不生成配置文件直接執行第4步中代碼,會報出以下的錯誤:
未處理 NHibernate
.Cfg.HibernateConfigExceptionHResult=-
2146232832Message=An exception occurred during configuration of persistence layer.Source=NHibernateStackTrace:在 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.FileNotFoundExceptionHResult=-
2147024894Message=未能找到文件“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 = falsetrans
.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
轉載于:https://www.cnblogs.com/gavanwanggw/p/7263388.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的NHibernate利用Mindscape.NHibernateModelDesigner实现数据库与实体之间的转换及操作的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。