Domanda

Sto cercando di utilizzare il metodo Delete () NPOCO per eliminare una riga dal database.Comunque lancia solo una nullreferenceexception.

Ho trovato una soluzione alternativa, ma mi chiedo se qualcuno sa perché la funzione di cancellazione incorporata da eliminare dall'ID non sembra funzionare per me.Ciò accade su più tavoli.Tutte le mie tabelle hanno una chiave primaria intera standard chiamata ID, che è stata contrassegnata nel modello utilizzando il decoratore [PrimaryKey("ID")].

Riferimento dell'oggetto non impostato su un'istanza di un oggetto.

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

L'ID superato è valido Un articolo è nel database.Il codice non arriva fino a eseguire qualsiasi SQL.

Stack Trace:

[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]
.

È stato utile?

Soluzione

Seguendo la fonte in repository GitHub Sembra che ci sia un bug in NPOCO: .

Non hai specificato quale tipo id è, ma suppongo che sia un int e hai il seguente codice:

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

che chiama npoco Delete<T>(object pocoOrPrimaryKey) , il Codice per il quale è:

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

che a sua volta chiama Npoco Delete(string tableName, string primaryKeyName, object poco, object primaryKeyValue) , il codice per il quale è:

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

Ho incluso solo le prime 2 righe in quanto è il metodo PocoDataFactory.ForObject che lancia l'eccezione in base alla tua traccia dello stack. Il codice per ForObject(object o, string primaryKeyName) è: Ecco cosa sta succedendo (supponendo che l'ID sia 12345, la tabella è mappata come acquisto e la chiave primaria è mappata come ID):

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

Il motivo per cui funziona Delete<PurchaseItem>("where id = @0", id);, è che segue un percorso di codice diverso in cui il tipo utilizzato per risolvere il PocoData proviene da typeof(T) in cui T è PurchaseItem.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top