Domanda

Ho questo codice:

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) { ... }
}

Quando provo a InsertOnSubmit (ip), ottengo una NullReferenceException (riferimento all'oggetto non impostato su un'istanza di un oggetto). dc non è nullo; ip e tutte le proprietà di ip non sono nulle; anche se alcuni sono vuoti.

VS2008 non mi permette di entrare in InsertOnSubmit, quindi non ho modo di sapere che cosa è specificamente nullo durante la valutazione. Cosa dà?

Nota: ho verificato e tutti i Linq.EntitySet creati dalle relazioni FK sono presenti e non nulli.

È stato utile?

Soluzione 2

Capito.

Invece di creare una classe che eredita dalla classe di DataContext, estendo la stessa classe DC stessa con una classe parziale nel livello Logica aziendale. Da lì posso aggiungere qualunque costruttore e metodo desideri.

In questo caso, è necessario copiare il codice dal costruttore esistente (generato automaticamente):

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(); }

Non sono sicuro di cosa ci sia in quel gestore OnCreated, ma sembra che stia facendo il lavoro che mi ha disossato prima. Funziona bene ora :)

Altri suggerimenti

In realtà è meglio aggiungere una chiamata al costruttore che chiama anche il costruttore generico come:

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

Poiché il costruttore predefinito inizializza già base (), this._Sessions ed esegue il metodo OnCreated, tutto ciò che devi fare nel costruttore esteso è questo:

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

È un DataContext generato da un designer o è il tuo creato a mano. Ho il sospetto che la tabella IP non possa essere istanziata nel momento in cui provi InsertOnSubmit(). Non riesco a vedere come ciò accadrà con un DataContext generato dal designer, ma sono noto per aver dimenticato di inizializzare le mie raccolte di volta in volta nel mio codice.

Puoi provare a vedere cosa sta succedendo, quali modifiche verranno apportate, se posizioni un breakpoint appena prima di SubmitChanges e fai una rapida occhiata a dc.GetChangeSet () .

Ho avuto una situazione leggermente diversa rispetto al richiedente, ma ho avuto lo stesso errore per gli stessi motivi. Ho scritto nuovi costruttori in una classe parziale per le mie entità di database, quindi ho provato a utilizzare gli oggetti risultanti in InsertOnSubmit chiamate.

Nessuna di queste risposte mi ha aiutato direttamente, ma sono stato in grado di capire a cosa stavano arrivando dopo averli letti tutti.

Il costruttore senza parametri generato automaticamente per l'entità fa le cose che devono accadere affinché <=> funzioni, quindi se sovraccarichi il costruttore - come me - o erediti dalla classe - come il richiedente - tu devi chiamare il costruttore di base dal tuo nuovo costruttore, in questo modo:

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

o

public class SubEntity: Entity {
    public SubEntity( Type parameter ) : base() {
        // do things with the parameter
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top