我正在尝试在 User 表和 UserInfo 表之间创建一个在一侧是可选的一对一关系。规范是一个 UserInfo 必须只有一个 User,而一个 User 可以有一个或零个 UserInfo。此外,我们要求 UserInfo 表中存在外键,这样 User 表的列就不会被修改。我们想使用 C# LINQ-to-SQL 中的关系,例如user.UserInfo.Email = "test@test.com",
userInfo.User` 等。
表的 T-SQL 和从 UserInfos 到用户的外键是(大致):
CREATE TABLE [dbo].[Users](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[Username] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_dbo.Users] PRIMARY KEY CLUSTERED ( [UserId] ASC ),
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[UserInfos](
[UserInfoId] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NOT NULL,
[Email] [varchar](250) NOT NULL,
CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED ( [UserInfoId] ASC ),
CONSTRAINT [UQ_UserId] UNIQUE NONCLUSTERED ( [UserId] ASC )
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[UserInfos] WITH CHECK
ADD CONSTRAINT [FK_UserInfos.UserID_Users.UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[Users] ([UserId])
GO
ALTER TABLE [dbo].[UserInfos] CHECK CONSTRAINT [FK_UserInfos.UserID_Users.UserId]
GO
问题是,如果我定义了从 Users.UserId (主键)到 UserInfos.UserId 的外键(我理解,这是定义非可选一对一关系的正确方法)然后执行 LINQ -to-SQL 代码user.UserInfo = null
还将 设置user.UserId
为default(int)
.
这是我用来定义Users
and之间的外键的 T-SQL UserInfos
:
ALTER TABLE [dbo].[Users] WITH CHECK
ADD CONSTRAINT [FK_Users.UserId_UserInfos.UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[UserInfos] ([UserId])
GO
ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [FK_Users.UserId_UserInfos.UserId]
GO
如果我没有定义这个外键,那么我不会在User
允许我访问UserInfo
. 如何在表之间建立关系,Users
并且UserInfos
可以使用 LINQ-to-SQL 进行遍历,同时允许这种关系从User
侧面为空?谢谢你。