我想在插入其他表数据时在我的数据库中输入唯一索引值。在这种情况下,我的表索引列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命令是什么?
答案 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列。