NPoco:Warum ist mein Löschen<Model>() aufruf, eine NullReferenceException auslösen?

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

  •  02-01-2020
  •  | 
  •  

Frage

Ich versuche, die Delete () -Methode von NPoco zu verwenden, um eine Zeile aus der Datenbank zu löschen.Es wird jedoch nur eine NullReferenceException ausgelöst.

Ich habe eine Problemumgehung gefunden, aber ich frage mich, ob jemand weiß, warum die integrierte Löschfunktion zum Löschen nach ID bei mir nicht zu funktionieren scheint.Dies geschieht an mehreren Tischen.Alle meine Tabellen haben einen ganzzahligen Standardprimärschlüssel namens ID, der im Modell mit dem gekennzeichnet wurde [PrimaryKey("ID")] Dekorator.

Objektreferenz nicht auf eine Instanz eines Objekts festgelegt.

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

Die übergebene ID ist gültig und das Element befindet sich in der Datenbank.Der Code kommt NICHT so weit, SQL auszuführen.

Stapelüberwachung:

[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]
War es hilfreich?

Lösung

Nach der Quelle in der GitHub-Repository es sieht so aus, als ob es einen Fehler in NPoco gibt:

Sie haben nicht angegeben, welcher Typ id ist, aber ich gehe davon aus, dass es ein int ist und Sie den folgenden Code haben:

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

Was NPoco nennt Delete<T>(object pocoOrPrimaryKey), der Code für den ist:

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
}

Was wiederum NPoco nennt Delete(string tableName, string primaryKeyName, object poco, object primaryKeyValue), der Code für den ist:

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

Ich habe nur die ersten 2 Zeilen eingefügt, da es die sind PocoDataFactory.ForObject methode, die die Ausnahme gemäß Ihrem Stack-Trace auslöst.Der Code für ForObject(object o, string primaryKeyName) is:

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

Folgendes passiert (vorausgesetzt, die ID ist 12345, die Tabelle ist als PurchaseItem und der Primärschlüssel als ID zugeordnet):

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

Der Grund dafür Delete<PurchaseItem>("where id = @0", id); funktioniert, ist, dass es einem anderen Codepfad folgt, in dem der Typ verwendet wird, um das aufzulösen PocoData kommt aus typeof(T) wo T is PurchaseItem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top