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

mgs*_*dew 2 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
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我这个索引值保存过程的LINQ命令是什么?

ssa*_*z23 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();
Run Code Online (Sandbox Code Playgroud)

注意:当然不建议将此解决方案用于在数据库中插入唯一ID,在问题下方的注释中仔细考虑Sharped和Magnus的建议,以便更好地使用自动增量或随机guid来解决您的问题.

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

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

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