문제

이 코드가 있습니다.

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에 들어 가지 못하게 할 수 없으므로 평가할 때 구체적으로 널이 무엇인지 알 수있는 방법이 없습니다. 무엇을 제공합니까?

참고 : 확인했으며 FK 관계에 의해 생성 된 모든 linq.entitysets가 존재하지 않고 널이 없습니다.

도움이 되었습니까?

해결책 2

알았어요.

Datacontext의 클래스에서 상속되는 클래스를 만드는 대신 비즈니스 로직 계층의 부분 클래스로 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(); }

그시기 핸들러에 무엇이 있는지 잘 모르겠지만, 일찍 나에게 뼈를 썼던 일을하고있는 것 같습니다. 지금 잘 작동합니다 :)

다른 팁

실제로 다음과 같은 일반 생성자를 호출하는 생성자에 호출을 추가하는 것이 좋습니다.

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

기본 생성자는 이미 base (), this._sessions를 초기화하고 onCreated 메소드를 실행하므로 확장 된 생성자에서해야 할 일은 다음과 같습니다.

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

이것은 디자이너가 DataContext를 생성 한 것입니다. 나는 당신이 당신의 시도 할 때 IPS 테이블이 인스턴스화되지 않을 것이라고 의심합니다. InsertOnSubmit(). 디자이너에서 생성 한 DataContext에서는 이것이 어떻게 일어날 지 알 수 없지만, 내 코드에서 수시로 내 컬렉션을 초기화하는 것을 잊어 버렸습니다.

Submitchanges 직전에 중단 점을 배치하고 빠른 시청을하면 어떤 일이 일어나고 있는지, 어떤 변경이 이루어질 것인지 확인할 수 있습니다. dc.getChangeset ().

나는 asker와 약간 다른 상황이 있었지만 같은 이유로 같은 오류를 얻었습니다. 데이터베이스 엔티티의 부분 클래스에 새로운 생성자를 작성한 다음 결과 객체를 사용하려고했습니다. InsertOnSubmit 전화.

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

엔티티의 자동 생성 매개 변수가없는 생성자는 InsertOnSubmit 일하기 위해서는 제작자 (나와 같은 등급 또는 클래스에서 물려받는 경우)와 같은 새 생성자에서 기본 생성자를 호출해야합니다.

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
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top