SQL Server Compact不支持服務器生成的密鑰和服務器生成的值

compact-framework entity-framework

我剛剛開始使用實體框架,所以我決定將它連接到我現有的SQL Server CE數據庫。我有一個IDENTITY(1,1)主鍵的表,但當我嘗試添加實體時,我遇到了上述錯誤。

MS Technet artice我學到了

與實體框架一起使用時,SQL Server Compact不支持具有服務器生成的密鑰或值的實體。使用實體框架時,實體的密鑰可能會標記為服務器生成。這使數據庫能夠在插入或實體創建時為密鑰生成值。另外,實體的零個或多個屬性可以標記為服務器生成的值。有關更多信息,請參閱Entity Framework文檔中的Store Generated Pattern主題。雖然實體框架允許您使用服務器生成的鍵或值定義實體類型,但SQL Server Compact在與實體框架一起使用時不支持具有服務器生成的密鑰或值的實體。對具有服務器生成的值的實體的數據操作操作會引發“不支持”異常。

所以現在我有幾個問題:

  • 如果不支持將密鑰標記為服務器生成,為什麼會拋出異常?從引用的段落中很難看出來。
  • 當我試圖將StoreGeneratedPattern =“Identity”添加到我的實體的屬性時,Studio抱怨它是不允許的。我做錯了什麼?
  • 此限制的最佳解決方法是什麼(包括切換到另一個數據庫)?我的限制是零安裝和使用實體框架。

一般承認的答案

當我遇到這個限制時,我將類型更改為uniqueidentifier


熱門答案

使用uniqueidentifier或手動生成bigint / int鍵值是最佳選擇。

這樣的事也許......

    private static object lockObject = new object();

    private static long nextID = -1;

    public static long GetNextID()
    {
        lock (lockObject)
        {
            if (nextID == -1) nextID = DateTime.UtcNow.Ticks; else nextID++;
            return nextID;
        }
    }

這假設您在應用程序運行期間每個tick不會生成多個記錄(加上停止和重新啟動的時間)。我認為這是一個合理的假設,但如果你想要一個完全防彈(但更複雜)的解決方案,那麼從數據庫中讀取最高的ID並從中遞增。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因