2011-09-15 6 views
1

현재이 문제가 발생합니다. POCO를 LINQ to SQL을 통해 데이터베이스 테이블에 수동으로 매핑했습니다. 이 모든 객체/테이블을 하나의 컨텍스트 (트랜잭션으로 처리됨)에 배치하여 트랜잭션에서 하나가 실패하면 모두 롤백 할 수 있도록하려고합니다.LINQ to SQL 1 : 1 삽입

이제 제가 직면하는 문제는 UserLogin과 UserProfile (1 : 0 - 1 관계)입니다. 그것들은 UserLogin의 ID가 PK이고 UserProfile에 대한 FK이고 UserProfile도 마찬가지입니다. UserLogin에서 IsDBGenerated를 true로 설정하여 ID를 자동으로 생성하도록 설정됩니다. 반면에 UserProfile에는 IsDBGenerated가 없습니다.

UserProfile은 UserLogin의 EntityRef로 설정되어 있으며 동일한 컨텍스트의 항목이므로 UserLogin.UserProfile = new UserProfile()을 만들 때 설정합니다.

모든 속성을 할당 한 후 table.InsertOnSubmit (UserLogin) 및 context.SaveChanges()를 수행했습니다. 진짜 문제는 어디에서 오는

이다. USERPROFILE의 ID는

누군가가 도와 드릴까요 0으로 남아있다?


미안하지만, 나 자신을 분명히하지 않았습니다. 1 관계 - 0 : 사용중인 SQL 서버는 MS SQL 서버 2008

엔티티 구조는 다음과 같이하고, 사용자 프로필이 그것에게 일을하지 동안

하고 UserLogin이 가입시 필수입니다. 따라서 두 테이블 모두에서 자동 증가가없는 것이 좋습니다.

UserProfile의 PK는 또한 UserLogin을 참조하는 FK입니다.

@GertArnold, 그렇습니다. asp.net 코드 숨김에서 UserProfile id = UserLogin id를 설정했지만 컨텍스트가 저장되기 전에 UserLogin의 ID는 0으로 유지됩니다.이 시점에서 두 레코드를 함께 추가하기를 원했기 때문입니다. Linq가 Sql에이 문제를 해결할 수있는 방법이 있는지 궁금합니다. 연관 속성을 추가 했으므로 Sql에서 Linq가이 종속성을 인식하고 제출시 ID를 추가해야합니다. 또는 적어도 저의 희망적인 생각입니다.

내 사용자 프로필에서

,이 조각이 내하고 UserLogin에서

[Column(IsPrimaryKey = true)] 
public long id { get; set; } 
private EntityRef<UserLogin> _login; 
[Association(ThisKey = "id", Storage = "_login")] 
public UserLogin UserLogin { get { return _login.Entity; } 
    set { _login.Entity = value; } } 

을, 나는 다음 코드가 :

[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
public long id { get; set; } 
private EntityRef<UserProfile> _profile; 
[Association(ThisKey = "id", Storage = "_profile")] 
public UserProfile UserProfile { get { return _profile.Entity; } 
    set { _profile.Entity = value; } } 

마지막으로, 내 코드 숨김, 난이 있습니다

UserLogin login = new UserLogin(); 
// All assigning here 
login.UserProfile = new UserProfile(); 
// Assign here 
login.userProfile.id = login.id; 

이 시점에서 두 ID는 아직 삽입되지 않았기 때문에 0입니다.

context.SubmitChanges()를 수행하면 UserLogin의 ID가 증가하지만 UserProfile의 ID는 0으로 유지됩니다. 동일한 컨텍스트에서 둘 다 래핑하고 함께 제출하려는 이유는 UserLogin이 제출했지만 UserProfile은 오류가 발생합니다. 그래서 내 DB에는 로그인에 대한 기록이 있지만 프로필이 아니라 내 데이터가 엉망입니다.

+0

어떤 유형의 데이터베이스를 사용하고 있습니까? UserProfile은 UserLogin의 하위 레코드이므로 (적어도 나에게 맞는 것 같습니다) 왜 Sentry에서는 UserProfile.Id가 AutoIncremting 필드가 될 수 있습니까? – esastincy

답변

2

나는 당신이 무엇을 얻고 있는지 이해하기 위해이 질문을 여러 번 읽어야했다.이 줄

그들은하고 UserLogin의 ID가 사용자 프로필에 PK와 FK를하고 동일

USERPROFILE

간다 방식으로 구성되어 처음 UserLoginUserProfile에 외부 키를 가지고 있음을 의미하는 듯 UserProfile에는 UserLogin에 대한 외래 키가 있습니다. 하지만 이제는 두 테이블의 PK에 동일한 값을 사용하는 것으로 생각합니다. UserLoginId = 123이면 프로파일을 만들겠습니다. UserProfileId 123.

왜이 작업을 수행하고 있습니까? 데이터베이스의 관점에서는 괜찮습니다. (특히 유익하지는 않지만 다소 혼란 스럽지만) LINQ-to-SQL은 기본 키로 사용되지 않고 단일 행에 대한 기본 키를 알고 싶어하는 기본 키를 원합니다. 다른 테이블의 경우. 그리고 그것은 또한 기본 키가 아닌 외래 키를 원합니다.

UserProfile 테이블의 값 123은 실제로는 UserLogin의 외래 키이지만 기본 키는 아닙니다. 기본 키가 될 필요는 없으며 LINQ-to-SQL에 대해 혼란을 야기합니다. UserProfile에는 자체 PK가 있습니다. 자동 증가 ID를 생성하고 외래 키로 변환 된 내용을 UserLogin으로 변경하십시오. 모든 문제가 해결 될 것입니다. 내 경험에

UserLogin 
PK - UserLoginId int identity 

UserProfile 
PK - UserProfileId int identity 
FK - UserLoginId int 

, 엔티티 프레임 워크는 단순 대리 기본 키와 가장 잘 LINQ - 투 - SQL & 모두 - 다른 모든 것들의 독립. 너무 까다 롭거나 비표준이라면 어떤 이점이나 단순성보다 더 많은 두통을 유발할 수 있습니다.

+0

네가 맞아. 그게 바로 내가 의도 한 것인데, 대리 키를 건너 뛰고 UserProfile의 id = UserLogin의 ID를 만드는 것입니다. EF에서는 유창한 API로 놀아서이 작업을 수행 할 수 있었지만 L2S에서는 사용할 수 없었습니다. 안타깝게도이 프로젝트는 여전히 L2S에 붙어있어서 EF4.1로 변환하기로 결정해야 할 때 힘든 시간을 줄 것입니다. 어쨌든 내 DBA에 대한 접근 방식을 제안하고 거기에서 어떻게 나가는 지 살펴 보겠습니다. 감사. –

+0

나는이 작업을 수행해야한다면 동일한 문제 (아래 링크)를 가지고있다. 관계형 데이터베이스에서 하드 코딩 된 일대일 관계를 잃게된다. 이것은 그 중요한 제약을 깨는 것이 가능하다는 것을 의미합니다. http://stackoverflow.com/questions/10212290/linq-one-to-one-association-submitchanges –

+0

@andicrook 질문을 삭제할 수 없으므로 질문이 삭제되었습니다. 하지만 전적으로 동의하지 않습니다. 1 : 1을 보장하기 위해 외래 키 열에 고유 한 제약 조건을 추가 할 수 있습니다. –