2016-02-04 55 views
3

一個主鍵是否有可能使用枚舉作爲一個表的主鍵?我有類似如下:將enum與EF

​​

,但我得到下面的錯誤進行初始化:

「System.InvalidOperationException」類型的unhanded異常出現在EntityFramework.dll

更多信息:關鍵組件'Id'不是'Thing'類型的聲明屬性。驗證它沒有被明確地從模型中排除,並且它是一個有效的基本屬性。

這並不表示它需要一個原語(枚舉是僅可澆注到primitave),但EF post around enums sugguests這是可能的

枚舉作爲鍵

此外,枚舉的屬性類型可以參與主鍵,唯一約束和外鍵的定義,並參與併發控制檢查,並聲明瞭默認值。

我做錯了什麼,或者這是不支持?

在一個側面不是我知道我可以在這個功能使用他人財產砍與不映射它翻譯鍵枚舉。這是不是我正在尋找的答案

+0

你有沒有考慮加入'Key'屬性?也是什麼版本的EF? –

+0

是的,它不會幫助(例如'HasKey(x => x.Id)')EF應該按照慣例挑選它,但我確實嘗試瞭解它是否是問題 –

+0

您是否首先執行代碼? –

回答

4

這不起作用,因爲您的枚舉基於uint。 EF不支持無符號整型一般(即你可以使用UINT類型的屬性),因此它不會枚舉性能正常工作。

我個人不枚舉密鑰的大風扇。這裏只是一對夫婦的原因:

  • 在數據庫中的值可以與您的枚舉定義
  • 這可以被打破開箱的不同步很容易,如果數據庫生成密鑰 - 通常是數據庫啓動從1生成的ID但是第一枚舉成員是0
  • 枚舉類型通常只有少量常量/成員。雖然有可能具有在枚舉基礎類型的範圍內,但不具有在枚舉類型相應的常數(和EF支持)的值這違背了使用枚舉類型
+0

太棒了,解決了這個問題。我把你所說的關於枚舉的東西當作關鍵字,我完全同意。我的用例是我想要一個與DB中另一個實體具有1:*關係的枚舉。枚舉表在應用程序啓動時更新,代碼中的實際枚舉以及任何不存在的枚舉被刪除。我想過使用一個完全獨立的密鑰,但是如果我直接從枚舉中直接播種數據,我不認爲它實際上爲我贏得了什麼。 –

+0

沒關係。就像所有的事情一樣 - 如果你明白事情是如何運作的,你應該好好地推動它的侷限和風險。 – Pawel

+0

是的,底層的原則是有一個單一的規範來源的數據。在這種情況下,代碼是規範的源代碼,但我想以特定的方式在數據庫中引用它。當您嘗試通過在代碼或應用程序中創建的事物來混合規範的源代碼時,您最終會遇到問題。 –

3

的目的看起來問題在於enum基礎類型。

我沒有」找到任何信息,但快速測試顯示,支持以下類型

byte, short, int, long 

及以下不

sbyte, ushort, uint, ulong