2009-01-31 2 views
15

이 코드가 있습니다LINQ InsertOnSubmit : NullReferenceException이

using DC = MV6DataContext; 
using MV6; // Business Logic Layer 
// ... 

public DC.MV6DataContext dc = new DC.MV6DataContext(ConnectionString); 
IP ip = new IP(Request.UserHostAddress); 
dc.IPs.InsertOnSubmit(ip); 
dc.SubmitChanges(); 

// in Business Logic layer: 
public class IP : DC.IP { 
    public IP(string address) { ... } 
} 

InsertOnSubmit (IP)를 시도하는시를, 나는 NullReferenceException이 (개체 참조가 개체의 인스턴스로 설정되지 않음) 얻을. dc가 null이 아닙니다. ip와 ip의 모든 속성은 null이 아닙니다. 일부는 비었지만.

VS2008 내가 InsertOnSubmit에 단계하지 않습니다, 그래서 평가되는 경우 특별히 널 (null)이 무엇인지 알 방법이 없습니다. 뭐라 구요?

참고 : 내가 확인했고, FK 관계에 의해 생성 된 모든 Linq.EntitySets 존재와 비 null입니다.

+0

가능한 중복 (HTTP : // 유래. com/questions/4660142/what-is-a-nullreference 예외 및 방법 -i-fix-i t) – Nasreddine

+0

@ Nasreddine : 2009 년에 제기 된 질문이 2011 년에 제기 된 질문과 중복 될 수 있음을 알 수 없습니다. – tsilb

답변

4

알 수 있습니다.

오히려의 DataContext의 클래스에서 상속하는 클래스를 만드는 대신, I은 비즈니스 로직 계층의 부분적인 클래스로 클래스 DC 자체를 연장한다. 거기에서 내가 원하는 생성자와 메서드를 추가 할 수 있습니다. 이 경우

, 기존의 (자동 생성) 생성자에서 코드를 복사하기 위해이 켜지지입니다 :

public IP(string address) { 
Address = address; 
Domain = ""; 
Notes = ""; 
FirstAccess = DateTime.Now; 
LastAccess = DateTime.Now; 
this._Sessions = new EntitySet<Session>(new Action<Session>(this.attach_Sessions), new Action<Session>(this.detach_Sessions)); 
OnCreated(); } 

하지 않는 것이 OnCreated 핸들러에서, 그러나 그것은 뼈 작업을하고있는 것 같다 무엇인지 나 일찍.

public IP(string address) : this() 
{ 
    Address = address; 
    Domain = ""; 
    Notes = ""; 
    FirstAccess = DateTime.Now; 
    LastAccess = DateTime.Now; 
} 
+0

thx : D LINQ 나 같은 방식으로 뼈를 012다) – SpoBo

+4

자동 genrated 생성자 (using : this())를 호출하는 것이 복사 붙여 넣기보다 낫다고 생각합니다. 대답은 – svick

+0

입니다. 아직도 우리가 부분 클래스로 DataContext 클래스를 확장해야하는 이유가 확실하지 않습니다. 나는이 방법을 시도했다.'public class IP : DC.IP { public IP() : base() {...} }'무엇이 잘못 되었습니까? – mehul9595

1

SubmitChanges 직전에 중단 점을 배치하고 dc.GetChangeSet()의 빠른 시계를 수행하면 어떤 일이 일어나는지, 어떤 변경이 수행되는지 확인할 수 있습니다.

+0

OK; 예외가 InsertOnSubmit에 throw되기 때문에 절대 해당 행에 도달하지 않습니다. – tsilb

+0

그건 해결책이 아니었지만, 내가 알지 못했던 무언가를 제공하는 것에 +1했습니다. – tsilb

2

디자이너가 생성 한 DataContext 또는 직접 작성한 것입니까? 나는 당신이 InsertOnSubmit()을 시도 할 때 IP 테이블이 인스턴스화되지 않을지는 의심 스럽다. 디자이너가 생성 한 DataContext로 어떻게 이런 일이 일어날 지 알 수는 없지만 수시로 내 코드에서 내 컬렉션을 초기화하는 것을 잊어 버렸습니다.

+0

아니, DataContext를 만들었습니다. 데이터 연결에서 테이블을 드래그 앤 드롭하고 생성자를 통과했습니다. 음, 구조. SELECT는 모두 정상적으로 작동합니다. – tsilb

+0

그건 해결책이 아니었지만 +1은 해결책을 제시 한 일반적인 방향으로 나를 움직였습니다. – tsilb

5

기본 생성자가 이미 기본(), this._Sessions를 초기화하고 OnCreated 방법을 실행하기 때문에 작동, 당신이 당신의 확장 생성자에서해야 할 일은 이것이다 또한 같은 일반 생성자를 호출하는 생성자를 호출 추가 : 내가 아스 커보다 약간 다른 상황이 있었다

public IP(string address) : this() { 
... 
} 
10

사실은 더 나은 미세한 지금 :)

1

을,하지만 같은 이유로 같은 오류가 발생했습니다. 내 데이터베이스 엔티티의 부분 클래스에 새 생성자를 작성한 다음 InsertOnSubmit 호출에서 결과 객체를 사용하려고했습니다.

이 답변 중 아무 것도 나를 직접 도왔지 만, 모든 것을 읽은 후에 그들이 무엇을 얻었는지 알 수있었습니다.

엔티티에 대한 자동 생성 매개 변수없는 생성자는 InsertOnSubmit에 대해 발생해야하는 작업을 수행합니다. 따라서 나처럼 - 생성자에 과부하가 걸리거나 클래스에서 상속 된 경우 - 예 : 과 같이, 새 생성자에서 기본 생성자를 호출하는 [? NullReferenceException이가 무엇을 어떻게해야합니까 고칠]

public partial class Entity { 
    public Entity(Type parameter) : this() { 
     // do things with the parameter 
    } 
} 

또는

public class SubEntity: Entity { 
    public SubEntity(Type parameter) : base() { 
     // do things with the parameter 
    } 
} 
관련 문제