EntityFramework.Core.dll中發生System.InvalidCastException

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

以下是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; }
}

在執行以下LINQ查詢時,我在foreach loop中的run-time時收到錯誤

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

以下是錯誤消息:

EntityFramework.Core.dll中出現“System.InvalidCastException”類型的異常,但未在用戶代碼中處理

附加信息:無法將類型為“System.Int32”的對象強制轉換為“System.String”。

LINQ查詢是錯誤還是其他任何錯誤?

一般承認的答案

根據事物的外觀,你在模型中犯了一個錯誤。

當您將外鍵TechnologyID定義為整數時,您嘗試使用無效的數據類型。不知道你正在使用什麼類型的數據庫,我假設你正在使用某種風格的sql server,在這種情況下數據類型“整數”不存在。

貝婁應該解決這個問題:

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

作為旁注,您並不總是需要為所有屬性指定類型名稱。如果你有一個int屬性並將它映射到int列,你只需使用[Column]屬性,EF將使用正確的int類型。當你在sql服務器中沒有很長的時候嘗試在模型中使用long時,指定類型名稱更為重要,因此你將TypeName屬性用作[Column(TypeName =“bigint”)]



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因