NPoco :Pourquoi mon appel Delete<Model>() lève-t-il une NullReferenceException ?

StackOverflow https://stackoverflow.com//questions/25082377

  •  02-01-2020
  •  | 
  •  

Question

J'essaie d'utiliser la méthode Delete() de NPoco pour supprimer une ligne de la base de données.Cependant, il lève simplement une NullReferenceException.

J'ai trouvé une solution de contournement, mais je me demande si quelqu'un sait pourquoi la fonction de suppression intégrée pour supprimer par ID ne semble pas fonctionner pour moi.Cela se produit sur plusieurs tables.Toutes mes tables ont une clé primaire entière standard appelée ID, qui a été signalée dans le modèle à l'aide du [PrimaryKey("ID")] décorateur.

La référence d'objet n'est pas définie à une instance d'un objet.

Delete<PurchaseItem>(id); // throws null reference exception.
Delete<PurchaseItem>("where id = @0", id);  // works.

L'identifiant transmis est valide et l'élément se trouve dans la base de données.Le code ne va PAS jusqu’à exécuter du SQL.

Trace de la pile:

[NullReferenceException: Object reference not set to an instance of an object.]
   NPoco.PocoDataFactory.ForObject(Object o, String primaryKeyName) in d:\Adam\projects\NPoco\src\NPoco\PocoDataFactory.cs:41
   NPoco.Database.Delete(String tableName, String primaryKeyName, Object poco, Object primaryKeyValue) in d:\Adam\projects\NPoco\src\NPoco\Database.cs:1587
   NPoco.Database.Delete(Object pocoOrPrimaryKey) in d:\Adam\projects\NPoco\src\NPoco\Database.cs:1598
   Harmsworth.DAL.HarmsworthDB.DeletePurchaseItemFromBasketByID(Int32 id) in c:\inetpub\wwwroot\harmsworth\Website\classes\HarmsworthDAL.cs:224
   Harmsworth.ViewBasketPage.RemoveItem(Int32 id) in c:\inetpub\wwwroot\harmsworth\Website\view-basket.aspx.cs:187
   Harmsworth.ViewBasketPage.PurchaseItemsRepeater_ItemCommand(Object sender, RepeaterCommandEventArgs e) in c:\inetpub\wwwroot\harmsworth\Website\view-basket.aspx.cs:75
   System.Web.UI.WebControls.Repeater.OnItemCommand(RepeaterCommandEventArgs e) +111
   [more redundant trace info]
Était-ce utile?

La solution

Suivant la source dans le Dépôt GitHub il semble qu'il y ait un bug dans NPoco :

Vous n'avez pas précisé quel type id est, mais je vais supposer que c'est un int et que vous avez le code suivant :

var id = 12345;
Delete<PurchaseItem>(id);

Qui appelle NPoco Delete<T>(object pocoOrPrimaryKey), dont le code est :

public int Delete<T>(object pocoOrPrimaryKey)
{
    if (pocoOrPrimaryKey.GetType() == typeof(T))
        return Delete(pocoOrPrimaryKey);
    var pd = PocoDataFactory.ForType(typeof(T));
    return Delete(pd.TableInfo.TableName, pd.TableInfo.PrimaryKey, null, pocoOrPrimaryKey); // This is the method your code calls
}

Ce qui appelle à son tour NPoco Delete(string tableName, string primaryKeyName, object poco, object primaryKeyValue), dont le code est :

public virtual int Delete(string tableName, string primaryKeyName, object poco, object primaryKeyValue)
{
    if (!OnDeleting(new DeleteContext(poco, tableName, primaryKeyName, primaryKeyValue))) return 0;
    var pd = PocoDataFactory.ForObject(poco, primaryKeyName);
    ...
}

Je n'ai inclus que les 2 premières lignes car c'est la PocoDataFactory.ForObject méthode qui lève l'exception en fonction de votre trace de pile.Le code pour ForObject(object o, string primaryKeyName) est:

public PocoData ForObject(object o, string primaryKeyName)
{
    var t = o.GetType(); // This is where the exception comes from
    ...
}

Voici ce qui se passe (en supposant que l'identifiant est 12345, la table est mappée en tant que PurchaseItem et la clé primaire est mappée en tant qu'Id) :

Delete<PurchaseItem>(pocoOrPrimaryKey : 12345);
Delete(tableName: "PurchaseItem", primaryKeyName: "Id", poco: null, primaryKeyValue: 12345);
PocoDataFactory.ForObject(o: null, primaryKeyName: Id);

La raison pour laquelle Delete<PurchaseItem>("where id = @0", id); fonctionne, c'est qu'il suit un chemin de code différent où le type utilisé pour résoudre le PocoData vient de typeof(T)T est PurchaseItem.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top