天天看點

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

環境:

&nbsp&nbspVisual Studio 2010

一、Mindscape.NhibernateModelDesigner安裝

&nbsp&nbsp在打開VS2010之後,我們可以在“工具”菜單下找到“擴充管理器,搜尋:Mindscape NHibernate Model Designer 下載下傳安裝即可。安裝完成後,在向項目中添加新項時如果我們拉到最下方我們會看到如下界面:

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

更加具體的操作可以參考:​​用好VS2010擴充管理器-NHibernate生成​​

二、根據資料庫表結構生成實體并通過實體進行操作

1、添加nhmodel實體

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作
NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作
NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作
NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作
NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

2、打開nhmodel實體,根據資料庫表生成實體

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作
NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

&nbsp&nbsp左側工具欄部分切換到【伺服器資料總管】,連接配接上你想要擷取資料結構的資料庫,就會看到展示出來的資料庫内容:

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

&nbsp&nbsp拖動你想要的表到設計器主界面,如下圖:

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

即可擷取到資料庫表對應的實體。

3、生成配置檔案

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作
NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作
NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作
NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

小注:

&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();      

三、根據實體生成資料庫表結構并通過實體進行操作

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

兩者之間的操作與之前一樣

小注:

&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      
NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

&nbsp&nbsp如果在主鍵類型你選擇的是Guid

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

&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類型的啊,此時需要修改你模型主鍵的生成規則:

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

在這裡修改為guid類型的就可以了

2、選擇主鍵的類型選擇int類型的時候:

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

&nbsp&nbsp此時通過實體操作資料是不需要填充主鍵字段的,你填充了也更新不進去。

NHibernate利用Mindscape.NHibernateModelDesigner實作資料庫與實體之間的轉換及操作

&nbsp&nbsp本文中有什麼不對的地方歡迎支出,謝謝

四、[NHibernate操作文檔及demo]