3

User テーブルと UserInfo テーブルの間に一方のオプションである 1 対 1 の関係を作成しようとしています。仕様では、UserInfo は正確に 1 つの User を持つ必要がありますが、User は 1 つまたはゼロの UserInfo を持つことができます。また、User テーブルの列が変更されないように、UserInfo テーブルに外部キーが存在する必要があります。C# LINQ-to-SQL でリレーションシップを使用したいと考えています (例: user.UserInfo.Email = "test@test.com",userInfo.User` など)。

テーブルの T-SQL と UserInfos から Users への外部キーは (大まかに) 次のとおりです。

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 への外部キーを定義すると (これは、オプションではない1 対 1 の関係を定義する正しい方法だと理解しています)、LINQ を実行することです。 -to-SQL コードuser.UserInfo = nullも を に設定user.UserIddefault(int)ます。

Usersとの間の外部キーを定義するために使用する 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にアクセスできる LINQ-to-SQL プロパティが取得されませんUserInfoUsersテーブルとLINQ-to-SQL でトラバース可能な関係をどのように持つことができますか?UserInfos同時に、この関係をUser側から null にすることができますか? ありがとうございました。

4

1 に答える 1

1

これを行うことはできますが、間違った側からアプローチしています。

電話すると

user.UserInfo = null;

例外は次のように述べています

User と UserInfo の間の関係を削除しようとしました。ただし、リレーションシップの外部キー (UserInfo.UserId) の 1 つを null に設定することはできません。

LINQ-to-SQL は、2 つの項目間の関係を削除しようとしていると見なします。そして間接的な方法であなたはそうです。ただし、例外は、あなたが自分で述べたことの単なる繰り返しUserInfoですUser。2 つのオブジェクトのリンクを解除していますが、削除していません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 に答える