繁体   English   中英

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

[英]How to insert data into multiple related tables in .NET Core API?

我想将数据插入到多个相关表中,我进行了搜索,但我发现的所有内容都是将数据插入到多个不相关的表中。 我有两张表User和OrchardTable,都是通过用户Id关联的,所以User表的主键是Id,在数据库上作为身份生成,OrchardTable表的外键是UserId .

这是来自我的 controller

[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 之间的关系。

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

任何帮助表示赞赏。

UPDATE 存储过程插入到表 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。 但是现在当我从 controller 调用它时,它似乎不起作用,因为数据库中没有显示保存的记录。

controller:

    [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 服务器上测试了存储过程并且可以工作,但是在 controller 上没有,我不知道为什么在 controller 上没有工作。 再次感谢任何帮助。

尝试这个:

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 });

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

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 的单个插入即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM