NPoco:¿Por qué mi llamada Delete<Model>() arroja una excepción NullReferenceException?

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

  •  02-01-2020
  •  | 
  •  

Pregunta

Estoy intentando utilizar el método Delete() de NPoco para eliminar una fila de la base de datos.Sin embargo, simplemente arroja una excepción NullReferenceException.

Encontré una solución alternativa, pero me pregunto si alguien sabe por qué la función de eliminación incorporada para eliminar por ID no parece funcionar para mí.Esto sucede en varias tablas.Todas mis tablas tienen una clave primaria entera estándar llamada ID, que se ha marcado en el modelo usando el [PrimaryKey("ID")] decorador.

Referencia a objeto no establecida como instancia de un objeto.

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

La identificación que se pasa es válida y el artículo está en la base de datos.El código NO llega tan lejos como para ejecutar ningún SQL.

Seguimiento de pila:

[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]
¿Fue útil?

Solución

Siguiendo la fuente en el repositorio de GitHub parece que hay un error en NPoco:

No has especificado de qué tipo id lo es, pero voy a asumir que es un int y tienes el siguiente código:

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

Que llama NPoco Delete<T>(object pocoOrPrimaryKey), cuyo código es:

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
}

Que a su vez llama a NPoco Delete(string tableName, string primaryKeyName, object poco, object primaryKeyValue), cuyo código es:

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

Solo he incluido las primeras 2 líneas ya que es el PocoDataFactory.ForObject método que arroja la excepción de acuerdo con el seguimiento de su pila.El código para ForObject(object o, string primaryKeyName) es:

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

Esto es lo que está sucediendo (asumiendo que la identificación es 12345, la tabla está asignada como elemento de compra y la clave principal está asignada como identificación):

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

La razón que Delete<PurchaseItem>("where id = @0", id); funciona, es que sigue una ruta de código diferente donde el tipo utilizado para resolver el PocoData viene de typeof(T) dónde T es PurchaseItem.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top