2015-02-23 56 views
1

我想在插入其他表數據時在數據庫中輸入唯一索引值。在這種情況下我的表索引列ID唯一但不自動增量。使用實體框架將唯一主鍵插入數據庫LINQ

我也想檢查目標表中索引值的最大值。如果表爲空,則索引值從0開始,或者如果它包含1行,則索引值從2開始。

已經可以使用存儲過程成功執行此操作。但是我想在保存數據時使用Entity Framework執行此操作。

我的存儲過程是:

ALTER PROCEDURE [dbo].[CreatePerson] 
    @Name Nvarchar(50), 
    @Code Nvarchar(50) 
AS 
BEGIN 
    Declare @Id int 
    SET @Id = ISNULL(((SELECT MAX([id]) FROM dbo.tbl_Person)+1),'1') 

    Insert Into dbo.tbl_Person([Id], [Name], [Code]) 
    Values (@id, @Name, @Code) 
END 

誰能告訴我什麼是LINQ命令該指標值保存過程?

+5

你應該更好地創建一個自動增量Id列... – rducom 2015-02-23 12:08:52

+0

將'id'更改爲'GUID'或自動遞增它。 – Magnus 2015-02-23 12:38:20

+0

如果我創建一個自動增量'Id'列並從數據庫表中刪除列數據,那麼會發生什麼? 如果這個序列號= 2,那麼新的列Id從1開始3 ......不是2 瞭解嗎?這是我的解決方案的問題@Sharped – mgsdew 2015-02-23 16:35:39

回答

5

您的SQL存儲過程到LINQ的的直翻譯將基本上是這樣的:

var newId = ctx.Persons.Any() ? ctx.Persons.Select(p => p.Id).Max() + 1 : 1; 
var newPerson = new Person { Id = newId, Name = someName, Code = someCode }; 
ctx.Persons.Add(newPerson); 
ctx.SaveChanges(); 

注:該解決方案肯定是不推薦用於插入唯一ID的數據庫中,可以考慮Sharped精心的建議和馬格努斯在下面的問題的意見,以更好地使用自動增量或隨機guid來解決你的問題。

有自動遞增的ID列代碼應該是這樣的:

var newPerson = new Person { Name = someName, Code = someCode }; 
ctx.Persons.Add(newPerson); 
ctx.SaveChanges(); 
var newId = newPerson.Id; 

注意,EF將在代碼更新新創建實體的id列給你自動的。

+0

謝謝它的工作原理.. – mgsdew 2015-02-23 16:50:41