微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我想将数据插入到多个相关表中,我进行了搜索,但我发现的所有内容都是将数据插入到多个不相关的表中。我有两个表User和OrchardTable,都是通过用户Id关联的,所以User表的主键是Id,在数据库上作为标识生成,表OrchardTable的外键是User 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();
}

所以,上面的代码做:首先将一个用户添加用户表中,在 sql Server Management Studio 上,每个用户的 ID 都是一个身份,因此当保存数据时,会生成 ID 并通过邮件生成恢复用户,通过Id建立User表和OrchardTable表的关系。

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

感谢任何帮助。

更新 插入表 User 并从同一个插入返回 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 上测试了存储过程并工作,但在控制器上没有,我不知道为什么在控制器上不起作用。 再次感谢您的帮助。

解决方法

试试这个:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。