繁体   English   中英

相关表插入数据

[英]Related tables inserting data

我有一个小问题。

项目的简短描述:我正在研究一个用 C# 编写的小 API 项目。 在这个项目中,我使用的是洋葱架构,简而言之,它类似于 Controller -> 服务 -> 存储库。

我有一个帐户 controller,它管理创建和更新用户,除此之外,我还有一个带有下表的数据库:

User, Password, UserInformation

User中,我有以下列:Id(PK)、用户名和角色。

Password中,我有:User_Id(用户 ID 列的 PK 和 FK)、密码和 oldPassword(如有必要)。

UserInformation中,我有:User_Id(PK 和 FK 到 User - Id 列)、firstName、lastName 和 email。

至于插入数据,我有一个单独的 class 字符串常量,里面是查询,我正在执行它们

sqlConnection.QueryAsync(QueryFromStringConstants, etcParams).

由于我对 SQL 语法以及与 SQL 相关的所有内容(哈哈)有点不适应,所以我的问题是:如果我创建一个User ,我怎样才能同时将数据插入到所有 3 个表中?

谢谢:)

每个插入都需要一个单独的插入语句,并且您还应该在每次插入之后获得一个标识值,以便将其用于下一次插入,例如:

  1. 插入用户: INSERT INTO User (userName, role) VALUES (...)
  2. 获取用户 ID(我确定您将其定义为 IDENTITY): DECLARE @userId AS integer = (SELECT @@IDENTITY);
  3. 插入用户密码(在前一步获得的用户 ID)
  4. 插入用户信息(相同)

但您也可以使用实体框架。 您应该创建 class User ,它具有PasswordUserInformation类型的虚拟属性(您也应该创建类)。 然后创建一个具有属性DbSet<User> Users的上下文。 在这种情况下,您只需创建一个 User 实例,使用 Password 和 UserInformation 类的对应实例填充其字段 Password 和 UserInformation。 然后使用:

context.Users.Add(userInstanceVar);
context.SaveChanges();

就是这样,EF 会将所有实例保存到您的数据库中。 并且还会自动填充所有标识值。

如果User表上的主键是intbigint ,则使用 function SCOPE_IDENTITY来获取 PK。

set nocount, xact_abort on;   --recommended

begin transaction;

insert into user(User_Id,userName,...)
values(...);

declare @user_id int = scope_identity();   -- make sure this is the very next line after insert

insert into Password(User_Id,....)
values(@user_id,...);

insert into UserInformation(User_Id,....)
values(@user_id,...);

commit transaction;

如果您正在执行多行插入,则可以使用表值参数。 然后您需要将OUTPUT子句到 output 的 ID 放入一个新的表变量中:

set nocount, xact_abort on;   --recommended

begin transaction;

declare @new_users table (user_id int, username varchar(50));

insert into user(User_Id,userName,...)
output inserted.user_id, inserted.username
select ...
from @users;

insert into Password(User_Id,....)
select u.user_id, ...
from passwords p
join @new_users u on u.username = p.username;

commit transaction;

不过我必须说,我没有看到为UserInformation单独的表的意义,毕竟,没有UserInformation就不能拥有User ,所以你应该将它们组合成一个。

您必须先插入主表,然后再插入其他表。 并使用事务来运行这三个语句。 以下是使用 oracle 程序的示例:

create or replace PROCEDURE InsertUser(.. params ...) 
as 
temp_id number;
BEGIN
insert into user(User_Id,userName,...) values(...) returning User_Id into temp_id;
insert into Password(User_Id,....) values(temp_id,...);
insert into UserInformation(User_Id,....) values(temp_id,...);
commit;
exception when others then rollback;
END InsertUser;

暂无
暂无

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

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