如何在SQL Server和LINQ to SQL中定义单侧可选的一对一关系?
我试图在用户表和用户信息表之间创建一对一的关系,这在一侧是可选的。规范是一个UserInfo必须只有一个用户,而一个用户可以有一个或零个UserInfo。我们还要求UserInfo表中存在外键,以便不修改User表的列。我们希望使用C#LINQ到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
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();