測試ODAC 11.2.0.3 + EF4自動跳號
0 |
剛好有網友提到ODAC 11.2.0.3 + EF4配合自動跳號的問題,之前曾用Devart EF元件實現過(且當時發現有SSDL無法自動更新的Bug),現在有了ODAC EF,又有Oracle Developer Tools for Visual Studio(ODT)加持,決定用新元件、新工具重新演練一次。
用ODT建立資料表上回就已示範,這次略過操作步驟,直接建好一個具有ID DECIMAL(10, 0), MTEXT VARCHAR2(100)兩個欄位的資料表MEMO。要在Oracle實現自動跳號,需要Sequence物件,而ODT提供設計Sequence的圖形化編輯介面:
下一步是為MEMO建立Trigger,在每次INSERT時,將ID欄位設為Sequence取出的下一次跳號,這部分一樣可透過ODT完成:
接著在專案中新增edmx,加入MEMO資料表,記得設定ID欄位的StoreGeneratedPattern屬性為Identity,註明它一個自動跳號識別欄位。
寫一小段程式測試連續新增。在建立MEMO物件時,只需指定MTEXT的值,ID的部分不需設定,理論上會啟用自動跳號機制。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OracleEF
{
class Program
{
static void Main(string[] args)
{
using (MyEntities ctx = new MyEntities())
{
MEMO m1 = new MEMO() { MTEXT = "Memo A1" };
ctx.MEMO.AddObject(m1);
ctx.SaveChanges();
MEMO m2 = new MEMO() { MTEXT = "Memo A2" };
ctx.MEMO.AddObject(m2);
ctx.SaveChanges();
foreach (var m in ctx.MEMO)
{
Console.WriteLine("{0}.{1}", m.ID, m.MTEXT);
}
}
Console.Read();
}
}
}
但程式在第二次ctx.SaveChanges()時爆出錯誤: ORA-00001: unique constraint (JEFF.PK_MEMO) violated
查詢資料表,發現出現一筆ID=0, MTEXT="Memo A1"的資料,推測是自動跳號失效,該不會又是老問題: EF4 StoreGeneratedPattern設定無效 重演吧? 那就用同樣的方法解決吧!
在.edmx檔按右鍵選"Open With...":
使用XML (Text) Editor開啟.edmx檔:
果不其然,在CSDL段有annotation:StoreGenerationPattern="Identity"(綠框處),但SSDL裡原本沒有紅框中的StoreGenerationPattern,要自己補上:
補上屬性後,重新執行程式,測試成功並順利新增兩筆資料。
測試結果: ODAC 11.2.0.3 + EF4 可支援自動跳號Primary Key,但VS2010 SP1有EF4 StoreGeneratedPattern設定無效 問題仍存在,故每次儲存edmx後記得要確認SSDL中的StoreGenerationPattern屬性。
Comments
Be the first to post a comment