System.InvalidCastException si è verificato in EntityFramework.Core.dll

asp.net-core entity-framework-core linq-to-entities

Domanda

Di seguito è l' Application Entity :

public class Application
{
    [Key]
    [Column(TypeName = "integer")]
    public int ApplicationID { get; set; }

    [Required]
    [Column(TypeName = "nvarchar(50)")]
    public string ApplicationName { get; set; }

    [Column(TypeName = "nvarchar(150)")]
    public string Description { get; set; }

    [Required]
    [ForeignKey("mTechnology")]
    [Column(TypeName = "integer")]
    public int TechnologyID { get; set; }

    [Required]
    [Column(TypeName = "int")]
    public string CreatedBy { get; set; }

    [Required]
    [Column(TypeName = "datetime")]
    public DateTime CreatedDate { get; set; }

    public virtual mTechnology Technology { get; set; }
}

Eseguendo la query LINQ sottostante, ricevo un errore in run-time nel foreach loop

List<int> technologyList = new List<int>();
var query = from a in _mApplicationDbContext.Applications
        group a.Technology by a.TechnologyID into g
        select new
        {
            TechnologyID = g.Key
        };

foreach (var item in query)
{
    technologyList.Add(item.TechnologyID);
}

Il seguente è il messaggio di errore:

Un'eccezione di tipo "System.InvalidCastException" si è verificata in EntityFramework.Core.dll ma non è stata gestita nel codice utente

Ulteriori informazioni: impossibile eseguire il cast dell'oggetto di tipo 'System.Int32' per digitare 'System.String'.

La query LINQ è errata o altri errori?

Risposta accettata

Dall'aspetto delle cose che hai fatto un errore nella tua modella.

Stai tentando di utilizzare un tipo di dati non valido quando definisci il tuo ID tecnologia chiave esterna come numero intero. Senza sapere quale tipo di database stai usando, sto assumendo che tu stia usando SQL Server di un certo sapore, nel qual caso il tipo di dati "intero" non esiste.

Il muggito dovrebbe risolvere il problema:

public class Application
{
    [Key]
    [Column]
    public int ApplicationID { get; set; }

    [Required]
    [Column(TypeName = "nvarchar(50)")]
    public string ApplicationName { get; set; }

    [Column(TypeName = "nvarchar(150)")]
    public string Description { get; set; }

    [Required]
    [ForeignKey("mTechnology")]
    [Column]
    public int TechnologyID { get; set; }

    [Required]
    [Column(TypeName = "int")]
    public string CreatedBy { get; set; }

    [Required]
    [Column]
    public DateTime CreatedDate { get; set; }

    public virtual mTechnology Technology { get; set; }
}

Come nota a margine non è sempre necessario specificare il nome del tipo per tutte le proprietà. Se hai una proprietà int e la stai mappando a una colonna int, puoi semplicemente usare l'attributo [Column] e EF userà il tipo int corretto. Specificare il nome del tipo è più importante quando si tenta di utilizzare un lungo nel modello quando non c'è un server sql lungo in modo da utilizzare la proprietà TypeName come [Column (TypeName = "bigint")]



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché