LINQ InsertOnSubmit: NullReferenceException

J’ai ce code:

using DC = MV6DataContext; using MV6; // Business Logic Layer // ... public DC.MV6DataContext dc = new DC.MV6DataContext(ConnectionSsortingng); IP ip = new IP(Request.UserHostAddress); dc.IPs.InsertOnSubmit(ip); dc.SubmitChanges(); // in Business Logic layer: public class IP : DC.IP { public IP(ssortingng address) { ... } } 

Lors de la tentative d’insertion de InsertOnSubmit (ip), j’obtiens une exception NullReferenceException (la référence d’object n’est pas définie sur une instance d’object). dc n’est pas nul; ip et toutes les propriétés de ip ne sont pas nulles; bien que certains soient vides.

VS2008 ne me laissera pas entrer dans InsertOnSubmit, je n’ai donc aucun moyen de savoir ce qui est spécifiquement nul lors de l’évaluation. Ce qui donne?

Remarque: j’ai vérifié et tous les Linq.EntitySets créés par les relations FK sont présents et non nuls.

En fait, il est préférable d’append à votre constructeur un appel qui appelle également le constructeur générique tel que:

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

Je l’ai.

Plutôt que de créer une classe qui hérite de la classe du DataContext, j’étends la classe DC elle-même avec une classe partielle dans la couche de logique applicative. À partir de là, je peux append les constructeurs et les méthodes que je souhaite.

Dans ce cas, il est nécessaire de copier le code du constructeur existant (généré automatiquement):

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

Je ne sais pas ce qu’il y a dans ce gestionnaire OnCreated, mais il semble faire le travail qui m’a fait mal plus tôt. Fonctionne bien maintenant 🙂

Puisque le constructeur par défaut initialise déjà base (), this._Sessions et exécute la méthode OnCreated, tout ce que vous devez faire dans votre constructeur étendu est le suivant:

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

Est-ce un DataContext généré par un concepteur ou votre propre construit à la main? Je soupçonne que la table IPs peut ne pas être instanciée au moment où vous essayez votre InsertOnSubmit() . Je ne vois pas comment cela se produirait avec un DataContext généré par le concepteur, mais on m’a souvent appris à oublier d’initialiser mes collections de temps en temps dans mon propre code.

Vous pouvez essayer de voir ce qui se passe, quels changements seront apportés, si vous placez un point d’arrêt juste avant SubmitChanges et surveillez rapidement dc.GetChangeSet () .

J’ai eu une situation légèrement différente de celle du demandeur, mais j’ai eu la même erreur pour les mêmes raisons. J’ai écrit de nouveaux constructeurs dans une classe partielle pour les entités de ma firebase database, puis essayé d’utiliser les objects résultants dans les appels InsertOnSubmit .

Aucune de ces réponses ne m’a aidé directement, mais j’ai été capable de comprendre ce à quoi elles voulaient en avoir pris connaissance après les avoir toutes lues.

Le constructeur sans paramètre généré automatiquement pour l’entité InsertOnSubmit les tâches InsertOnSubmit au bon fonctionnement de InsertOnSubmit . Par conséquent, si vous surchargez le constructeur – comme moi – ou héritez de la classe – comme le demandeur – vous devez appeler la base. constructeur de votre nouveau constructeur, comme ceci:

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

ou

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