3

我正在尝试在 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.UserIddefault(int).

这是我用来定义Usersand之间的外键的 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侧面为空?谢谢你。

4

1 回答 1

1

你可以这样做,但你从错误的角度接近它。

你打电话时

user.UserInfo = null;

例外规定

试图删除用户和用户信息之间的关系。但是,不能将关系的外键之一 (UserInfo.UserId) 设置为 null。

LINQ-to-SQL 认为您正在尝试删除这两项之间的关系;并且以间接的方式你是。但例外只是重申你自己所说的 -UserInfo必须有一个User. 您正在取消链接这两个对象,但您没有删除UserInfo- 您UserInfo在上下文中留下了一个无法持久保存到数据库的孤立对象(由于外键约束)。

答案?删除UserInfo.

var user = context.Users.First();
var userinfo = user.UserInfos;
user.UserInfos = null;
context.UserInfos.DeleteOnSubmit(userinfo);
context.SubmitChanges();

// or, even simpler:
var user = context.Users.First();
context.UserInfos.DeleteOnSubmit(user.UserInfos);
context.SubmitChanges();
于 2011-10-04T03:02:47.587 回答