如何在.NET Core API中将数据插入多个相关表



我想将数据插入到多个相关的表中,我搜索了一下,但我找到的都是将数据插入多个不相关的表。我有两个表User和OrchardTable,它们都由用户Id相关,所以User表的主键是Id,它在数据库上作为标识生成,而OrchardTTable表的外键是用户Id。

这是我的控制器

[HttpPost]
public ActionResult post([FromBody] Models.Users u)
{
using (Models.OrchardAdminContext db = new Models.OrchardAdminContext())
{
Models.User oUser = new Models.User();
Models.OrchardTable userOrchar = new Models.OrchardTable();
oUser.Name = u.Name;
oUser.Email = u.Email;
db.User.Add(oUser);
db.SaveChanges();

var idUser = db.OrchardTable.Where(x => x.email = oUser.Email).FirstOrDefault();
userOrchar.IdUser = idUser.Id;
userOrchar.orchardUbication = u.ubication;
db.OrchardTable.Add(userOrchard);
db.SaveChanges();
}
return Ok();
}

因此,上面的代码做到了:首先将一个用户添加到user表中,在SQL Server Management Studio上,每个用户的Id都是一个身份,因此当数据保存时,就会生成Id,并通过邮件恢复用户的Id,从而通过Id建立user表和OrchardTable表之间的关系。

我认为这是一种方法,但不是最好的。除了主要问题,我想知道是否有更好、正确的方法来插入。

感谢您的帮助。

更新要插入到表User中并从同一instert返回Id的存储过程:

GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE spUserInsert 
@name varchar(20),
@email varchar(100)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
insert into user(name, email) values (@name, @email);
DECLARE @Id INT  
SET @Id=@@IDENTITY  
SELECT @Id AS id
END
GO

因此,如果我没有错的话,我们的想法是创建一个要插入的SP,并返回该插入的id,然后用该id将其发送到另一个SP,在那里它被插入OrchardTable。但现在,当我从控制器调用它时,它似乎不起作用,因为数据库中没有显示保存的记录。

控制器:

[HttpPost]
public ActionResult post([FromBody] Models.Users u)
{
using (Models.OrchardAdminContext db = new Models.OrchardAdminContext())
{
Models.User oUser = new Models.User();
Models.OrchardTable userOrchar = new Models.OrchardTable();
oUsuar.Name = u.Name;
oUsuar.Email = u.Email;

var idUserReg = db.User.FromSqlRaw("Execute spUserInsert @name, @email", oUsuar.Name, oUsuar.Email);
db.SaveChanges();
}
return Ok();
}

我在Sql Server上测试了存储过程并运行了,但在控制器上不运行,我不知道为什么在控制器上不能运行。再次感谢您的帮助。

关于封装插入的过程,我想你可以这样做

create procedure UserInsert 
@Name varchar(20),
@Email varchar(100)
<@anyOtherParameters>
as
set nocount, xact_abort on
declare @Id int
begin tran
insert into [user]([name], email)
values (@Name, @Email);
set @Id=Scope_Identity();
insert into OrchardTable (Id, <othercolumns?>)
values (@Id, @OtherParams?);
commit tran
go

您只需要从代码中进行一次调用,该过程将插入user,获得identity,然后将此Id插入OrchardTable

如果你需要包括任何其他数据,也可以作为参数传递并用于插入-如果你只想要一个具有相应ID的行,那么就只保留为ID的单个插入。

试试这个:

var pName = new SqlParameter("@name", oUsuar.Name);
var pEmail = new SqlParameter("@email", oUsuar.Email);

var idUserReg = db.DataBase.ExecuteSqlCommand("Exec spUserInsert @name, @email", 
new[] { pName, pEmail });

相关内容

  • 没有找到相关文章

最新更新