如何在SQL Server和LINQ to SQL中定义单侧可选的一对一关系?

如何在SQL Server和LINQ to SQL中定义单侧可选的一对一关系?,sql,tsql,linq-to-sql,one-to-one,cardinality,Sql,Tsql,Linq To Sql,One To One,Cardinality,我试图在用户表和用户信息表之间创建一对一的关系,这在一侧是可选的。规范是一个UserInfo必须只有一个用户,而一个用户可以有一个或零个UserInfo。我们还要求UserInfo表中存在外键,以便不修改User表的列。我们希望使用C#LINQ到SQL中的关系,例如,user.UserInfo.Email=”test@test.com“,userInfo.User”等 表的T-SQL和从UserInfos到Users的外键大致如下: 问题是,如果我定义了一个从Users.UserId(主键)到U

我试图在用户表和用户信息表之间创建一对一的关系,这在一侧是可选的。规范是一个UserInfo必须只有一个用户,而一个用户可以有一个或零个UserInfo。我们还要求UserInfo表中存在外键,以便不修改User表的列。我们希望使用C#LINQ到SQL中的关系,例如,
user.UserInfo.Email=”test@test.com“,
userInfo.User”等

表的T-SQL和从UserInfos到Users的外键大致如下:

问题是,如果我定义了一个从Users.UserId(主键)到UserInfos.UserId(据我所知,这是定义非可选一对一关系的正确方法)的外键,那么执行LINQ到SQL代码
user.UserInfo=null
也会将
user.UserId
设置为
default(int)

下面是我用来定义
Users
UserInfos
之间的外键的T-SQL:

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

如果我没有定义这个外键,那么在
用户
上就没有LINQ to SQL属性,允许我访问
用户信息
。如何在表
Users
UserInfos
之间建立一个关系,该关系可以通过LINQ to SQL进行遍历,同时允许该关系从
User
端为空?谢谢。

你可以这样做,但你走错了方向

当你打电话的时候

user.UserInfo = null;
例外情况表明:

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

linqtosql认为您正在试图删除这两个项之间的关系;间接地说,你就是。但例外情况只是重复了您自己所说的内容-一个
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();

没有可接受的回答,这不是重复;这个问题是问如何在数据库中对这种关系建模。谢谢。首先,我认为我对这种关系的定义是错误的。通过在UserInfo一侧创建外键和唯一索引,我获得了我想要的行为。我还没有测试user.UserInfo=null是否是一个问题。
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();