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クエリを実行すると、実行run-timeforeach loopでエラーが発生し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);
}

以下はエラーメッセージです:

EntityFramework.Core.dllで 'System.InvalidCastException'型の例外が発生しましたが、ユーザーコードで処理されませんでした

追加情報:タイプ 'System.Int32'のオブジェクトをキャストして 'System.String'と入力できません。

LINQクエリが間違っている、または他のエラーがありますか?

受け入れられた回答

あなたが間違って作ったものを見れば、あなたはモデルです。

外来キーのTechnologyIDを整数として定義するときに、無効なデータ型を使用しようとしています。あなたが使用しているデータベースのタイプを知っているので、私はいくつかの風味のSQLサーバを使用していると仮定しています。その場合、データ型 "整数"は存在しません。

ベローが問題を解決する必要があります:

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

副次的なことに、すべてのプロパティにtypenameを指定する必要はありません。 int型のプロパティを持ち、それをint型のカラムにマッピングしている場合は、[カラム]属性を使用するだけで、EFは正しいint型を使用します。 TypeNameプロパティを[Column(TypeName = "bigint")]として使用すると、長いSQL Serverがないときにモデルでlongを使用しようとすると、型名を指定する方が重要です。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ