剛好有網友提到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

Post a comment