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

Insert Unique Primary Key into Database using Entity-Framework LINQ

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

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

将 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 列。