2012-06-23 207 views
22

我在EF上收到此錯誤。實體框架錯誤:無法在表中插入標識列的顯式值

Cannot insert explicit value for identity column in table 'GroupMembers_New' when IDENTITY_INSERT is set to OFF.

在分貝列標識增量並在EF的設計文件,StoreGeneratedPatternidentity爲好。似乎EF每次嘗試保存時都試圖插入0。

一些建議說ID保留在表中或刪除表並重新運行腳本。

任何想法?

下面是一些代碼:

GroupMember groupMember = new GroupMember(); 
      groupMember.GroupId = group.Id; 
      groupMember.UserId = (new UserId(group.Owner)); 
      //groupMember.Id = _groupContext.GroupMembers.Count(); 
      group.GroupMembers.Add(groupMember); 

      _groupContext.SaveChanges(); 

database

EF Designer

回答

35

我以前也遇到了這個。此錯誤意味着您正嘗試將值顯式指定給數據庫自動分配的列。

建議: 更新您的edmx文件以反映您可能在數據庫中所做的任何更改。 如果數據庫自動分配值,則應在該屬性下的設計器文件中看到「IsDbGenerated = true」屬性。如果它不在那裏,你可以手動添加它。

+2

事實上,更新edmx是解決方案。在ef5中謝謝 –

+2

在edmx設計器中有一個名爲'StoreGeneratedPatern'的字段的屬性 - 將其設置爲'Identity' – timothy

18

試試這個:

using System.ComponentModel.DataAnnotations.Schema; 
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public decimal Identity_Col { get; set; } 

實體框架類文件添加幾行代碼來標識列。

+2

但是這也會生成id。 如果我想指定自己的值並將其用作表的主鍵,該怎麼辦。 –

+0

首先使用EF Core代碼,我有一個組合鍵的表,一列是Identity。添加屬性'[DatabaseGenerated(DatabaseGeneratedOption.Identity)]'爲我工作。 –

3

在EF 6中,模型中的字段/列具有以下屬性: StoreGeneratedPattern。

將其設置爲屬性下拉列表中的「標識」。

(我不知道EF 4.上述答案,使用IsDbGenerated,似乎是EF 4)

與此對應的底層XML對元素的屬性:

<Property Name="MyTableId" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> 

- 但您不需要手動處理XML,因爲您可以使用設計器。

這是如何搞砸了不清楚。即使在從數據庫中刷新我的模型之後,我仍然遇到了問題。如果您在表格中設置PK,或者在生成模型後更改其名稱,可能會感到困惑。 (我使用的是表/數據庫優先的方法,而不是代碼優先)

您不能使用上述方法將C#屬性放在實體代碼上,因爲在這種情況下,實體代碼是由EF 。 EF應該理解(「自己」)該領域是一個身份。

8

把這些attribs上是身份屬性的頂部:

[Key] 
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public int ID { get; set; } 
+0

這似乎不適用於Azure移動服務。我有一個模型與此作爲字段: [Index(IsClustered = true)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [TableColumnAttribute(TableColumnType.CreatedAt)] public DateTimeOffset? CreatedAt {get;組; } – WiteCastle

+2

我添加了屬性,現在我得到這個錯誤:「ReferentialConstraint中的依賴屬性映射到商店生成的列」 – Logar314159

+0

這對我來說非常合適。謝謝。 –

3

在谷歌首次比賽,所以在這裏我的解決辦法:第一

EF代碼:因爲一個AUTOINC PK「身份證」的領域和一個guid列,像這樣的設計:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid FileToken { get; set; } 

有一個重複的身份。我將其更改爲:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
[DefaultValue("newid()")] 
public Guid FileToken { get; set; } 

並且問題消失了。

希望它可以幫助你。

埃裏克

+0

首先使用EF Core代碼,我有一個帶有組合鍵的表,其中一列是Identity。添加屬性'[DatabaseGenerated(DatabaseGeneratedOption.Identity)]'爲我工作。 –

0

我在我的應用程序這一問題;並修復了它將id字段的屬性「StoredGeneratedPattern」更改爲Identity。

所以,去模型;看看桌子;點擊主關鍵字的propierties;並更改屬性。

相關問題