原來的程序是使用sqlite這個嵌入式數據庫作為Remit(code name)的數據源的,因為NHibernate支持這 個,然而有一點不好的是sqlite不支持外鍵,導致可悲的codesmith不能得到關系,無法生成我喜歡的多對多 映射.如果手寫就要寫映射xml文件以及業務實體類,這可是我這種懶人不喜歡的.況且數據庫經常變更,良 好的代碼生成可以做到數據庫與代碼的同步.
硬盤壞了也是一種契機,我突然想到了Sql Server還有一個CE版本,現在不止提供For Mobile的,還提供 桌面版.這種可愛的嵌入式數據庫可比沒意思的Access好得多了. 這東西雖然沒store produce(其實有ORM 基本沒必要用),但是索引啊,表關系啊還是很全面的.微軟的東西就是好,造福全懶人嘛..
然而我的數據庫原來是Access的,在網上找了半天工具只找到一個Sql To Sql Ce的工具.於是用Access 的升遷向導升遷到MS SQL,然後在MS SQL Server裡面建立表關系.然後用那個工具導入到SQL CE裡面. 然 後又自己編譯了一個Codesmith的數據庫Schema provider(因為以前這個是for 4.0的,而我的是5.0).
那個遷移工具貌似有點問題,沒有把表關系完全copy過去,自己的SQL Menagement Studio版本可能太低 ,不能打開3.5的CE數據庫.結果用Codesmith就沒法生成我要的關系.不爽.想到NHibernate其實對於表關系 是不依賴於數據庫的,只要有表就可以了,所以想到一個特別二的方法,就是用MS SQL做Codesmith的數據源 ,生成文件,而程序中則使用遷移後的CE數據庫.(其實感覺直接用MS SQL Server也可以,最後發布的時候換 CE)
不過最郁悶的事情是在使用NHibernate進行測試的時候,居然提示我某個查詢不能執行,而我在VS 2008 的數據庫的查詢裡面那個查詢是可以運行的SELECT this_.ID as ID2_0_, this_.BookName as BookName2_0_, this_.LangID as LangID2_0_ FROM dbo.Book this_ 我實在是很無奈啊,找錯誤 NHibernate扔出來的異常的InnerException也看不出什麼來,我就自己用ADO寫了一個
System.Data.SqlServerCe.SqlCeConnection conn=new System.Data.SqlServerCe.SqlCeConnection(@"Data Source=E:\Loning\Loning.Remit\db.sdf");
SqlCeCommand command=new SqlCeCommand("SELECT this_.ID as ID2_0_, this_.BookName as BookName2_0_, this_.LangID as LangID2_0_ FROM dbo.Book this_",conn);
conn.Open();
最後這東西提示表名異常,我一檢查表名,想起由於是Sql Server生成的,帶著個dbo.前綴,發現生成的 NHibernate的配置文件
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Loning.Remit.BusinessObjects" assembly="Loning.Remit">
<class name="Loning.Remit.BusinessObjects.Book, Loning.Remit" table="dbo.Book" lazy="true">
<id name="Id" column="ID">
<generator class="assigned" />
</id>
<property name="BookName" column="BookName" />
<many-to-one name="Language" column="LangID" class="Language" />
<bag name="Words" lazy="true" cascade="all" inverse="true" >
<key column="BookID"></key>
<one-to-many class="Word"></one-to-many>
</bag>
</class>
</hibernate-mapping>
其中存在dbo.,去掉之後正常,於是更改Codesmith的這個模板.把table.FullName改成table.Name,生成 後配置文件正確,而後重新生成一遍,編譯.過了. 我從下午5點開始折騰,一直折騰到11點,總算把這些問題 解決了,希望CE這東西可以好好工作...