NHibernate利用Mindscape.NHibernateModelDesigner實現資料庫與實體之間的轉換及操作
環境:
  Visual Studio 2010
一、Mindscape.NhibernateModelDesigner安裝
  在開啟VS2010之後,我們可以在“工具”選單下找到“擴充套件管理器,搜尋:Mindscape NHibernate Model Designer 下載安裝即可。安裝完成後,在向專案中新增新項時如果我們拉到最下方我們會看到如下介面:
更加具體的操作可以參考:用好VS2010擴充套件管理器-NHibernate生成
二、根據資料庫表結構生成實體並通過實體進行操作
1、新增nhmodel實體
2、開啟nhmodel實體,根據資料庫表生成實體
  左側工具欄部分切換到【伺服器資源管理器】,連線上你想要獲取資料結構的資料庫,就會看到展示出來的資料庫內容:
  拖動你想要的表到設計器主介面,如下圖:
即可獲取到資料庫表對應的實體。
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
相關文章
- ADO資料與XML資料間的轉換的類(ASP實現) (轉)XML
- 利用ODBC實現Domino和關聯式資料庫的互操作 (轉)資料庫
- 利用DB Link實現資料庫間的表同步資料庫
- 字串與資料流之間的轉換字串
- 如實實現不同資料庫之間的 (模型) Eloquent: 關聯資料庫模型
- jQuery物件和DOM物件之間的轉換實現jQuery物件
- ORACLE資料庫中SCN與時間的轉換Oracle資料庫
- RGB和HSL之間的轉換 C++實現C++
- 【asp.net core 系列】8 實戰之 利用 EF Core 完成資料操作層的實現ASP.NET
- PHP常用操作類實現——資料庫操作類PHP資料庫
- WPS如何實現資料轉換
- 利用WPS 2007快速實現日期資料轉換
- 用Asp實現對ORACLE資料庫的操作Oracle資料庫
- Sqoop解決關係型資料庫與HDFS之間進行資料轉換OOP資料庫
- Oracle資料庫安全策略與實現方法(轉)Oracle資料庫
- Python實戰之Oracle資料庫操作PythonOracle資料庫
- hibernate及SpringBoot整合Jpa實現對資料庫操作Spring Boot資料庫
- Java 資料型別之間的轉換Java資料型別
- Restcloud ETl實踐之資料行列轉換RESTCloud
- Oracle資料庫日期格式轉換操作Oracle資料庫
- 一種專家資料庫的開發與實現 (轉)資料庫
- Java Stram實現Map和字串之間互相轉換| BaeldungJava字串
- bundle實現Activity之間的資料傳遞
- Fluent API 配置實體和資料庫之間的對映關係API資料庫
- 資料庫連線池的實現及原理資料庫
- Python 實現Excel和TXT文字格式之間的相互轉換PythonExcel
- 利用python實現mysql資料庫向sqlserver的同步PythonMySql資料庫Server
- Oracle資料庫的SCN轉換成時間和時間轉換成SCNOracle資料庫
- asp.net 2個ListBox之間轉移資料的實現ASP.NET
- intent實現apk之間的跳轉IntentAPK
- NSData與UIImage之間的轉換UI
- 在Java中利用動態代理實現資料庫連線與事務的自動管理【轉】Java資料庫
- Redis 設計與實現 (五)--多機資料庫的實現Redis資料庫
- Gson轉換 — json資料轉換為Object實體公共方法JSONObject
- asp中利用陣列實現資料庫記錄的批次錄入方法 (轉)陣列資料庫
- SQL利用資料庫日誌恢復資料到時間點的操作 -- 轉自網路SQL資料庫
- One to One 的資料庫模型設計與NHibernate配置資料庫模型
- 資料庫索引型別及實現方式資料庫索引型別