2011-05-26 72 views
13

我有一個SQL Server數據庫。這個數據庫有一個名爲Item的表。 Item有一個名爲「ID」的屬性。 ID是我桌子上的主鍵。此主鍵以1爲增量值的int當我嘗試插入記錄,我收到一個錯誤,指出:IDENTITY INSERT和LINQ to SQL

當IDENTITY_INSERT設置

無法插入表「項目」標識列顯式值。到OFF「

我在嘗試使用下面的代碼插入記錄:

public int AddItem(Item i) 
    { 
    try 
    { 
     int id = 0; 
     using (DatabaseContext context = new DatabaseContext()) 
     { 
     i.CreatedOn = DateTime.UtcNow; 
     context.Items.InsertOnSubmit(i); 
     context.SubmitChanges(); 
     id = i.ID; 
     } 
     return id; 
    } 
    catch (Exception e) 
    { 
     LogException(e); 
    } 
    } 

當我看i.ID提交之前,我注意到i.ID被設置爲0這意味着我試圖插入0作爲身份不管怎樣,我不確定它應該是什麼。有人可以幫我嗎?

謝謝!

+0

是否確定將該列設置爲數據庫中的主鍵,並且您的Linq to Sql生成的類反映了該列。我知道有時候我忘了標記一個列作爲主鍵,然後我生成的類需要更新。 – 2011-05-26 13:26:44

回答

9

這聽起來很簡單,彷彿你的模型不知道它的事實的身份;應該將ID列標記爲數據庫生成的(UI中的Auto Generated Value或xml中的IsDbGenerated),並且可能將其作爲主鍵。然後它不會嘗試插入它,並且在寫入之後將正確地更新該值。

2

在您調用context.SubmitChanges();之前,ID將爲零。瀏覽代碼並查看SubmitChanges被調用後的值。請記住,數據庫實際上是分配ID(假設它是一個自動遞增鍵)。

看看這個:

Working with Entity Keys

7

將id屬性設置的 「自動生成」 屬性設置爲 「真」。

0

您必須在映射中定義在數據庫中生成的id。要做到這一點的方式取決於您使用的映射類型。如果您使用的是代碼屬性,請確保您在屬性(或XML映射)中的ColumnAttribute中指定IsDbGenerated。如果您使用的是dbml文件,請確保將「自動生成的值」設置爲true。

6

檢查ID財產Item類中,以確保它有一個像這樣的屬性:

[Column(Storage="_ID", AutoSync=AutoSync.OnInsert, 
    DbType="INT NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)] 

看那IsDbGenerated=true,它是這裏最重要的人。

也許你使用設計調整SQL Server上的IDENTITY之前,所以才重新生成這個類(通過刪除在設計表,並從服務器資源管理器再次下探)共同創造的DatabaseContext

0

最簡單的方法是:1。 開放的dbml 2.選擇類,在屬性窗口中生成的屬性(應該設置爲True)

主鍵 4.檢查自動插入 3.選擇列