Indipendentemente dal metodo che utilizzo per eseguire query sui dati, non riesco a superare questo metodo. Emette sempre un errore:
Il cast specificato non è valido.
Non sono sicuro del motivo per cui questo sta impazzendo sul casting. La colonna è definita come INT(10)
in MySQL, il modello è un INT
sull'attributo ID
, la variabile di input è un INT
, eppure c'è ancora un errore di cast! L'uso quasi identico della stessa logica per creare, eliminare e getAllCustomer
metodi getAllCustomer
funziona getAllCustomer
. Questo è l'unico problema.
Ecco il metodo in questione:
public static bool UpdateCustomerById(int id, string updatedName, int updatedAddressId)
{
try
{
using (Context db = new Context())
{
Customer customer = (Customer)db.Find(typeof(Customer),id);
//Customer customer = db.Customer.Find(id);
customer.AddressId = updatedAddressId;
customer.CustomerName = updatedName;
db.SaveChanges();
}
return true;
}
catch (Exception err)
{
Console.WriteLine("Error: " + err);
throw new Exception("Couldn't update the customer because: " + err);
}
}
Modello:
using System;
using System.Collections.Generic;
namespace Scheduler.Data.Models
{
public partial class Customer
{
public int CustomerId { get; set; }
public string CustomerName { get; set; }
public int AddressId { get; set; }
public sbyte Active { get; set; }
public DateTime CreateDate { get; set; }
public string CreatedBy { get; set; }
public DateTime LastUpdate { get; set; }
public string LastUpdateBy { get; set; }
}
}
Rappresentazione della tabella HTML della tabella del database
<table border=1>
<tr>
<td bgcolor=silver class='medium'>Field</td>
<td bgcolor=silver class='medium'>Type</td>
<td bgcolor=silver class='medium'>Null</td>
<td bgcolor=silver class='medium'>Key</td>
<td bgcolor=silver class='medium'>Default</td>
<td bgcolor=silver class='medium'>Extra</td>
</tr>
<tr>
<td class='normal' valign='top'>customerId</td>
<td class='normal' valign='top'>int(10)</td>
<td class='normal' valign='top'>NO</td>
<td class='normal' valign='top'>PRI</td>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'></td>
</tr>
<tr>
<td class='normal' valign='top'>customerName</td>
<td class='normal' valign='top'>varchar(45)</td>
<td class='normal' valign='top'>NO</td>
<td class='normal' valign='top'></td>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'></td>
</tr>
<tr>
<td class='normal' valign='top'>addressId</td>
<td class='normal' valign='top'>int(10)</td>
<td class='normal' valign='top'>NO</td>
<td class='normal' valign='top'></td>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'></td>
</tr>
<tr>
<td class='normal' valign='top'>active</td>
<td class='normal' valign='top'>tinyint(1)</td>
<td class='normal' valign='top'>NO</td>
<td class='normal' valign='top'></td>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'></td>
</tr>
<tr>
<td class='normal' valign='top'>createDate</td>
<td class='normal' valign='top'>datetime</td>
<td class='normal' valign='top'>NO</td>
<td class='normal' valign='top'></td>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'></td>
</tr>
<tr>
<td class='normal' valign='top'>createdBy</td>
<td class='normal' valign='top'>varchar(40)</td>
<td class='normal' valign='top'>NO</td>
<td class='normal' valign='top'></td>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'></td>
</tr>
<tr>
<td class='normal' valign='top'>lastUpdate</td>
<td class='normal' valign='top'>timestamp</td>
<td class='normal' valign='top'>NO</td>
<td class='normal' valign='top'></td>
<td class='normal' valign='top'>CURRENT_TIMESTAMP</td>
<td class='normal' valign='top'>on update CURRENT_TIMESTAMP</td>
</tr>
<tr>
<td class='normal' valign='top'>lastUpdateBy</td>
<td class='normal' valign='top'>varchar(40)</td>
<td class='normal' valign='top'>NO</td>
<td class='normal' valign='top'></td>
<td class='normal' valign='top'>NULL</td>
<td class='normal' valign='top'></td>
</tr>
</table>
traccia errore:
System.Exception
HResult=0x80131500
Message=couldn't update the customer because: System.InvalidCastException: Specified cast is not valid.
at MySql.Data.MySqlClient.MySqlDataReader.GetFieldValue[T](Int32 ordinal)
at lambda_method(Closure , DbDataReader )
at Microsoft.EntityFrameworkCore.Storage.Internal.TypedRelationalValueBufferFactory.Create(DbDataReader dataReader)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.BufferlessMoveNext(DbContext _, Boolean
buffer)
at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func`3
operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
at lambda_method(Closure )
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ResultEnumerable`1.GetEnumerator()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.<_TrackEntities>d__17`2.MoveNext()
at
Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass15_1`1.<CompileQueryCore>
b__0(QueryContext qc)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
at System.Linq.Queryable.First[TSource](IQueryable`1 source, Expression`1 predicate)
at Scheduler.Data.CustomerDao.UpdateCustomerById(Int32 id, String updatedName, Int32 updatedAddressId)
Source=Scheduler.Data
StackTrace:
at Scheduler.Data.CustomerDao.UpdateCustomerById(Int32 id, String updatedName, Int32 updatedAddressId) in
C:\Users\source\repos\Scheduler\Scheduler.Data\CustomerDao.cs:line 79
at Scheduler.Dashboard.ApplyChangesButton_Click(Object sender, EventArgs e) in
C:\Users\source\repos\Scheduler\Scheduler\Dashboard.cs:line 112
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr
lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr
dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext
context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at Scheduler.Program.Main() in C:\Users\source\repos\Scheduler\Scheduler\Program.cs:line 19
Qualsiasi pensiero o difetto evidente sul perché questo metodo in particolare non funziona sarebbe fantastico, grazie
La soluzione che ho riscontrato a questo problema era aggiornare il tinyint (1) in un tinyint (3). La modifica che ha risolto gli errori di casting in quanto il framework di entità è stato in grado di lavorare con esso come previsto. Il gotcha è nella CLI che lo rende un tinyint (1) per impostazione predefinita, quindi aggiornandolo in un tinyint (3) dopo che il fatto dovrebbe risolverlo.