2008-10-08 2 views
1

LinqToSql 모델에서 매우 흥미로운 문제가 있습니다. 일부 내 테이블에 다른 테이블에 대한 참조가 있고 LinqToSql이 EnitiyRef 클래스에 의해 나타납니다, LinqToSql 참조 테이블에 액세스하려고하면 데이터베이스에서 참조를로드합니다.LinqToSql 참조 엔티티는 NullReferenceException을 던질 것입니다

제 개발 컴퓨터에서 모든 것이 잘 동작했습니다 (참조가 완벽하게로드되었습니다).하지만 어젯밤에 프로덕션 서버로 변경 내용을 업로드하고 내 테이블에 대한 참조에 액세스 할 때 NullReferenceExceptions가 발생하기 시작했습니다.

샘플 코드 : 처음에

var sale = db.Sales.Single(s => s.ID == 1); 
string username = sale.User.Name; // User is a reference to a User table 
            // LinqToSql will automatically load the 
            // row and access the fields i need. 

// On my server the sale.User throws an exception that its null (User) but the user 
// is definitly in the database (there is even a FK constraint from Sale to User) 

나는 내 DataContext에이 GC'd있어하지만 (내 상자에서 작동 외에) 내가없는 결과 모든 검사를 두 번 생각했다.

(모든 서버와 내 상자 같은 DLL 년대에 동일 같은 DB 스키마 등) 는

+0

그래서 상자에 컴파일되어 컴파일 된 프로그램이 제대로 실행되지만 프로덕션 서버에서 충돌이 발생합니까? (동일한 바이너리 또는 동일한 소스에서 실행한다는 의미) – Sam

+0

동일한 바이너리. 모든 것이 내 상자에 컴파일됩니다. –

답변

2
(I 실제로 전체 DBF는 동일한 스키마 그래서 내 서버로 파일을 복사)

컨텍스트 로깅을 켜고 devbox의 결과를 제작 상자의 결과와 비교 했습니까?

+0

답변 해 주셔서 감사합니다. 문맥은 AttributedMetaModel이 서버에 다른 버전을 가지고 있고 내 컴퓨터에서 sysadmin이 3.5 SP1이 아니라 3.5 SP1을 설치했다는 것을 밝혀 냈습니다. 얼마나 혼란 스럽습니까 (그리고 얼마나 절름발이). 어쨌든 고마워. –

1

원본을 프로덕션 서버로 이동하여 컴파일 한 경우 DataContext에 대해 생성 된 소스를 다시 생성 해보십시오. DataContext 소스 파일의 상황에 맞는 메뉴에서 "사용자 정의 도구 실행"을 실행하면됩니다.

둘 다 동일한 이진 파일을 공유하는 경우 두 데이터베이스에서 데이터베이스 정의가 정확히 동일해야합니다. 프로덕션 서버에서 하나의 열을 null 허용 할 수 있지만 devbox에서 null을 허용하지 않는 것과 같은 작은 차이는 모든 차이를 만들 수 있습니다.

+0

이 문제를 명확히하기 위해 질문이 업데이트되었습니다. –

1

이와 같은 문제를 찾아서 해결하려면 stacktrace와 아마도 데이터베이스의 프로파일 링에 도움이 될 것입니다.

이 문제는 보안 문제 일 수 있습니다. 응용 프로그램에서 사용하는 것과 동일한 자격 증명으로 Management Studio에 로그인하려고 시도했으나 테이블에서 선택을 수행했습니다.

적어도 보안이나 linq 문제에 대한 아이디어를 줄 것입니다.

+0

사용하는 사용자는 데이터베이스의 소유자입니다. SQL 프로파일 러는 기본 테이블 (판매)에 대한 원본 트래픽 이외의 트래픽을 표시하지 않습니다. –

+0

참조를 모델링 했습니까? 그리고 참조하는 엔터티에 대한 데이터가 실제로 존재합니까? – bovium

+0

1-1 명의 관계 또는 1-many의 관련성을 보았습니까? – bovium

0

DataContext 수명을 검사하십시오. 예를 들어 여기

직장에서 오래된 캐시가있을 수 있습니다 :

  1. Context1 : ID의 == 1.로드 판매는 사용자 속성을 검사하고 널 (null) 사용자를 관찰한다.
  2. Context2 : ID가 == 1 인 판매를로드하십시오. 새 사용자를 추가하여 사용자 속성을 수정하십시오. 범하다.
  3. Context1 : ID가 == 인로드 판매 1. User 속성을 검사하십시오. 그래, 아직도 null이다 (그것은 캐시되었다!!).
0

DBML에서 사용하는 연결 문자열이 아직 Production 이외의 데이터베이스 서버를 가리키는 경우가 있습니다.

LinqDataSource가 ASPX 페이지에서 직접 사용될 때마다 DataProcess가 마지막 개발자가 DBML을 가져 오는 데 사용한 데이터베이스를 기반으로하는 연결 문자열을 가리키는 기본 생성자를 사용하고 있었을 때 이러한 일이 일어났습니다.

우리가 한 것은 생성 된 DataContext에서 상속 받고 기본 생성자를 web.config의 올바른 연결 문자열로 오버라이드 한 DataContext 개체를 만드는 것입니다.

+0

연결 문자열은 실제로 동일하지만 127.0.0.1을 기반으로하는 문제가 아니므로 내 서버가 인터넷에 있고 방화벽 아래에있는 인스턴트 메신저를 사용해야합니다. –

+0

BTW 프로덕션 서버에서 다른 연결 문자열이 필요할 때 다른 솔루션을 사용합니다. DBML 파일의 연결 문자열을 (none)으로 설정하면 매개 변수없는 생성자가 생성되지 않습니다. 그런 다음 config 파일의 문자열을 사용하여 새 인스턴스에 정적 메서드를 추가합니다. –

관련 문제