我在ASP.NET MVC3项目中插入以下内容:
var query = "INSERT INTO MyTable VALUES(//some values)";
db.Database.ExecuteSqlCommand(query);
是否有一种简单的方法来获取插入行的ID?
编辑:
我的存储过程:
CREATE PROCEDURE addGetID
(
@PersonnelID INT,
@ShiftWorkID BIGINT,
@EntranceDateTime DATETIME,
@WorkflowStateRelationID BIGINT
)
AS
INSERT INTO DynamicDataEntrances VALUES (@PersonnelID, @ShiftWorkID, @EntranceDateTime, @WorkflowStateRelationID)
SELECT @@IDENTITY
我的代码行:
string dt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
SqlParameter PersonnelID = new SqlParameter("@PersonnelID", 1);
SqlParameter ShiftWorkID = new SqlParameter("@ShiftWorkID", 2);
SqlParameter EntranceDateTime = new SqlParameter("@EntranceDateTime", dt);
SqlParameter WorkflowStateRelationID = new SqlParameter("@WorkflowStateRelationID ", db.WorkflowStateRelations.Where(wsr => wsr.WorkflowID == dp.WorkflowID).Select(x => x.ID).FirstOrDefault());
SqlParameter returnValue = new SqlParameter();
returnValue.Direction = ParameterDirection.ReturnValue;
// try 1
db.Database.ExecuteSqlCommand("addGetID(@PersonnelID, @ShiftWorkID, @EntranceDateTime, @WorkflowStateRelationID )", PersonnelID, ShiftWorkID, EntranceDateTime, WorkflowStateRelationID, returnValue);
// try 2
db.Database.ExecuteSqlCommand("addGetID @PersonnelID @ShiftWorkID @EntranceDateTime @WorkflowStateRelationID ", PersonnelID, ShiftWorkID, EntranceDateTime, WorkflowStateRelationID, returnValue);
// try 3
db.Database.ExecuteSqlCommand("exec addGetID @PersonnelID={0} @ShiftWorkID={1} @EntranceDateTime={2} @WorkflowStateRelationID={3} ", PersonnelID, ShiftWorkID, EntranceDateTime, WorkflowStateRelationID, returnValue);
var id = returnValue.Value;
答案 0 :(得分:4)
我赞同[scartag] [1]。但要分两部分回答你的问题。
如果您要使用直接sql,那么要做的是创建一个返回@@IDENTITY
值的存储过程。然后用参数ParameterDirection.ReturnValue
执行Sp并使用该值。
像这样:
SqlParameter entityField = new SqlParameter("@firstName", "Frank");
SqlParameter returnValue = new SqlParameter();
returnValue.Direction = ParameterDirection.ReturnValue;
db.Database.ExecuteSqlCommand("sp_ByPassEFAndInsertEntity(@firstName)",
entityField, returnValue);
var id = returnValue.Value;
或者只是使用EF。创建并初始化Entity
,将其添加到适用的DbSet
并调用savechanges。您的实体实例的Id列将使用数据库生成的值进行更新。
编辑2:我将第一个解决方案应用于我的本地数据库,并且可以让它给出返回值。经过一些研究,我得到了一个回报值。我有一个带有Blog表的本地数据库。我创建了一个addBlog SP,这就是你如何获得返回值 - 但是你必须使用SqlQuery而不是使用ExecSqlCommand。
这是我的SP:
ALTER PROCEDURE [dbo].[addBlog]
@BlogName varchar(50),
@CreateDateTime datetime
AS
BEGIN
insert into Blog (Name, DateTimeCreated) values (@BlogName, @CreateDateTime)
declare @return int
set @return = @@identity
select @return
END
和我的EF代码:
using (var db = new StackOverflowEntities()) {
SqlParameter blogName = new SqlParameter("BlogName", "New Name 2");
SqlParameter createDate = new SqlParameter("CreateDate", DateTime.Now);
int? newIdentityValue = db.Database.SqlQuery<Int32>("addBlog @BlogName, @CreateDate", blogName, createDate).FirstOrDefault();
Debug.WriteLine(newIdentityValue);
}
答案 1 :(得分:1)
没有。您无法从此方法获取插入行的ID。
它只返回一个int(告诉你受影响的行数)。
您的代码告诉我您已经在使用EF了,为什么不使用API的其他方面?
既然你似乎热衷于使用原始sql路由,为什么不使用像dapper,large或petapoco这样的工具呢?
答案 2 :(得分:-1)
SELECT scope_identity()
作为您的返回值