[英]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 个表中?
谢谢:)
每个插入都需要一个单独的插入语句,并且您还应该在每次插入之后获得一个标识值,以便将其用于下一次插入,例如:
INSERT INTO User (userName, role) VALUES (...)
DECLARE @userId AS integer = (SELECT @@IDENTITY);
但您也可以使用实体框架。 您应该创建 class User
,它具有Password
和UserInformation
类型的虚拟属性(您也应该创建类)。 然后创建一个具有属性DbSet<User> Users
的上下文。 在这种情况下,您只需创建一个 User 实例,使用 Password 和 UserInformation 类的对应实例填充其字段 Password 和 UserInformation。 然后使用:
context.Users.Add(userInstanceVar);
context.SaveChanges();
就是这样,EF 会将所有实例保存到您的数据库中。 并且还会自动填充所有标识值。
如果User
表上的主键是int
或bigint
,则使用 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.