2010-04-14 2 views
5

Linq to SQL을 사용하는 MVC2 앱에서 다음 오류가 발생합니다 (새로운 기능 임). 이상한 mdf가 아닌 실제 SQL 서버에 연결되었습니다.널 값을 사용할 수없는 값 유형 인 System.Int64 멤버에 null 값을 할당 할 수 없습니다.

System.InvalidOperationException The null value cannot be assigned to a member with type System.Int64 which is a non-nullable value type 

My SQL 테이블에 MessageID라는 열이 있습니다. 그것은의 BIGINT 타입 및 기본 키, NULL NOT과 IDENTITY 1, no 기본값 내 DBML 디자이너에서

을 가지고는이 필드에 다음 선언이 있습니다

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_MessageId", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)] 
public long MessageId 
{ 
    get 
    { 
     return this._MessageId; 
    } 
    set 
    { 
     if ((this._MessageId != value)) 
     { 
      this.OnMessageIdChanging(value); 
      this.SendPropertyChanging(); 
      this._MessageId = value; 
      this.SendPropertyChanged("MessageId"); 
      this.OnMessageIdChanged(); 
     } 
    } 
} 

그것은 계속 나에게 그 널 이야기를 할당 할 수 없습니다 - null을 통과하지 못합니다! 그것은 길다 - 그것은 심지어 null이 될 수 없다!

나는 바보 같은 짓을하고 있습니까? 어디서나 솔루션을 찾을 수 없습니다!

이 속성의 유형을 Nullable<long>으로 변경하여이 작업을 만들었지 만, 틀림없이 이것이 맞을 수 있습니까?

업데이트 : InsertOnSubmit을 사용하고 있습니다. 간체 코드 :

public ActionResult Create(Message message) 
{ 
    if (ModelState.IsValid) 
    { 
     var db = new MessagingDataContext(); 
     db.Messages.InsertOnSubmit(message); 
     db.SubmitChanges(); //line 93 (where it breaks) 
    } 
} 

이 질문의 맨 위에 오류가있는 SubmitChanges()가 있습니다.

갱신 2 : 스택 추적 :

at Read_Object(ObjectMaterializer`1) 
    at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert(TrackedObject item) 
    at System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject item) 
    at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 
    at Qanda.Controllers.MessagingController.Ask(Message message) in C:\Qanda\Qanda\Controllers\MessagingController.cs:line 93 

갱신 3 : 아무도 알고 난 현상금을 제공 할 수있는 충분한 영향력을 가지고 있지 않습니다! 그래서 내 ASP.NET blog에 계속했다. 도와주세요!

+0

InsertOnSubmit 메서드를 사용하려고하는데이 예외가 발생합니까? – Raja

+0

오류의 원인이되는 코드를 표시 할 수 있습니까? 덕분에 – Geoff

+0

. 내 질문을 업데이트했습니다 – BritishDeveloper

답변

6

시간이 좀 걸렸지 만 나는 이것이 일어나고 있음을 알고 공유 할 것이라고 생각했습니다. 테이블에 인서트가 있었기 때문입니다. 나는 그것에 대해 더 자세히 여기에 optimistic concurrency exception with triggers에 대해 썼다. 이것은 엔티티 프레임 워크와 관련이 있지만, 처음부터 당혹감을 유발하는 트리거라고 확신합니다.

+1

+1 블로깅을 보내 주셔서 감사합니다. 그것은 무의미한 디버깅 2 시간 낭비 후 찾을 수있는 유일한 참조했습니다. 나는 이것을 ADO.Net으로 돌아 간다. – Laramie

+1

나를 위해 +1, 내 제외 System.Int32 (ID 열 데이터 형식은 INT); 또한 INSERT 트리거를 사용했다. 근본적인 문제는 'SCOPE_IDENTITY()'가 트리거가 활성화되면 NULL을 반환한다는 것입니다 (저에게 버그처럼 보입니다). 나이가 좋지 않은'@@ IDENTITY' 값은 정확합니다. – devstuff

+0

BTW, 이것은 알려진 문제 : http://connect.microsoft.com/SQLServer/feedback/details/427640/instead-trigger-break-the-scope-identity-scope – devstuff

2

Result 클래스에서 정의한 값 유형을 nullable로 설정해야합니다.

귀하의 경우에는 int64를 사용 하시겠습니까?

디자이너가 생성 한 designer.cs 파일의 개체 코드 (사용중인 경우)를 확인하십시오.

이 코드를 수정하고 부분 클래스에 배치하면 디자이너가 코드를 덮어 쓰지 않습니다.

+0

또는 dbml 속성에 nullable = false를 설정하면됩니다. 좋아,이 작동하지만 왜 그것은 nullable해야합니까? 이 문제를 해결했지만 이것이 올바른지 확인하고 싶었습니다. 해킹뿐만 아니라 – BritishDeveloper

+0

값 유형은 널이 될 수 없으며 데이터베이스 필드는 널 값을 리턴합니다. 전달 될 때 예외가 발생합니다. 값 유형 변수를 널 (NULL) 입력 가능으로 설정하면 값 유형이 널 값을 허용 할 수 있습니다. –

0

이 문제는 3 개의 테이블의 데이터를 반환하는 저장 프로 시저를 호출하는 것입니다. 왼쪽 외부 조인 문제는 Bigint Type이 Null이므로 LINQ에서 극복하기 위해 ISNULL (OID, 0)을 적용했습니다.

0

먼저 어떤 열이 예외의 원인인지 확인한 다음 테이블 또는 EF 모델에서 기본값을 사용합니다.

이 열에 대해 아무 것도 저장하지 않으면 기본값으로 저장되며이 오류는 다시 발생하지 않습니다.

관련 문제