使用Entity-Framework LINQ将唯一主键插入数据库

时间:2015-02-23 12:00:22

标签: c# asp.net linq-to-sql entity-framework-4

我想在插入其他表数据时在我的数据库中输入唯一索引值。在这种情况下,我的表索引列ID唯一,但不是自动递增。

我还想检查目标表中索引值的最大值。如果表为空,则索引值从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命令是什么?

1 个答案:

答案 0 :(得分: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和Magnus的建议,以便更好地使用自动增量或随机guid来解决您的问题

使用自动递增的id列,您的代码将如下所示:

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

请注意,EF将自动在代码中为您更新新创建的实体的id列。