2011-09-05 3 views
3

사용자 테이블과 UserInfo 테이블 사이의 한 쪽에서 선택 사항 인 일대일 관계를 만들려고합니다. 사양은 UserInfo가 정확히 하나의 User를 가져야하며 User는 하나 또는 두 개의 UserInfos를 가질 수 있어야한다는 것입니다. 또한 User 테이블의 열이 수정되지 않도록 UserInfo 테이블에 외래 키가 존재해야합니다.SQL Server 및 LINQ-to-SQL에서 일방 선택적인 일대일 관계를 정의하는 방법?

: 우리는 C# LINQ - 투 - SQL 등 예를 들어, user.UserInfo.Email = "[email protected]", userInfo.User`,

사용자에 UserInfos에서 테이블에 대한 T-SQL 및 외래 키가 (거의)이다의 관계를 사용하고 싶습니다

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 

문제는 내가 UserInfos.UserId에 Users.UserId (기본 키) (에서 외부 키를 정의 할 경우, 이는 이해, 올바른 방법이 하나에 아닌 선택 사항을 정의하는 것입니다 -one 관계) LINQ-to-SQL 코드 user.UserInfo = null을 실행하면 user.UserIddefault(int)으로 설정됩니다. 나는이 외부 키를 정의하지 않는 경우, 나는에는 LINQ - 투 - 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 

: 여기

내가 UsersUserInfos 사이에 외부 키를 정의하는 데 사용하는 T-SQL입니다 User을 사용하면 UserInfo에 액세스 할 수 있습니다. 테이블 UsersUserInfos 사이에 LINQ-to-SQL로 트래버스 가능한 관계를 어떻게 가질 수 있습니까? 동시에이 관계가 User 쪽에서 null이 될 수 있습니까? 고맙습니다.

+2

[중복 (http://stackoverflow.com/questions/1921788/linq-2-sql-one-to-zero-or-one-relationship-possible) ; 그 질문은 데이터베이스에서이 관계를 모델링하는 방법을 묻는 것입니다. –

+2

없이 –

답변

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(); 
이는 중복 적으로 허용 아니다 않음
+0

감사합니다. 처음에는 관계를 잘못 정의하고 있다고 생각합니다. UserInfo 측면에 외래 키와 고유 인덱스를 모두 작성함으로써 원하는 동작을 얻었습니다. 아직 user.UserInfo = null이 문제인지 여부는 아직 테스트하지 않았습니다. –

관련 문제