最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - .NET System.InvalidCastException issue when no cast should need to be applied - Stack Overflow

programmeradmin0浏览0评论

I have the following models:

[Table("league_seasons")]
public class LeagueSeason
{
    [Key]
    [Column("league_season_id")]
    public required int Id { get; set; }

    [ForeignKey("League")]
    [Column("league_id")]
    public required int LeagueId { get; set; }

    [ForeignKey("Season")]
    [Column("season_id")]
    public required int SeasonId { get; set; }

    [Column("yahoo_league_season_id")]
    public string? YahooLeagueSeasonId { get; set; }

    [Column("num_teams")]
    public required int NumTeams { get; set; }

    [Column("num_playoff_teams")]
    public int? NumPlayoffTeams { get; set; }

    [Column("num_weeks")]
    public required int NumWeeks { get; set; }

    [Column("rivalry_weeks")]
    public string? RivalryWeeks { get; set; }

    [Column("nut_cup_week")]
    public required int NutCupWeek { get; set; }

    [Column("avg_points")]
    public required double AvgPoints { get; set; }

    [Column("avg_moves")]
    public required double AvgMoves { get; set; }

    [Column("completed")]
    public required int Completed { get; set; }

    [Column("create_date")]
    public required DateTime CreateDate { get; set; }

    [Column("modify_date")]
    public required DateTime ModifyDate { get; set; }


    // Relationships
    public virtual required League League { get; set; }
    public virtual required Season Season { get; set; }
    public virtual required ICollection<Team> Teams { get; set; }
}

[Table("seasons")]
public class Season
{
    [Key]
    [Column("season_id")]
    public required int Id { get; set; }

    [Column("yahoo_season_id")]
    public int? YahooSeasonId { get; set; }

    [Column("name")]
    public required string Name { get; set; }

    [Column("start_date")]
    public required DateOnly StartDate { get; set; }

    [Column("end_date")]
    public required DateOnly EndDate { get; set; }

    [Column("create_date")]
    public required DateTime CreateDate { get; set; }

    [Column("modify_date")]
    public required DateTime ModifyDate { get; set; }

    // Relationships
    public virtual ICollection<LeagueSeason> LeagueSeasons { get; set; }

for the following tables in my database:

CREATE TABLE `league_seasons` (
    `league_season_id` INT(10) NOT NULL AUTO_INCREMENT,
    `league_id` INT(10) NOT NULL,
    `season_id` INT(10) NOT NULL,
    `yahoo_league_season_id` VARCHAR(50) NULL DEFAULT NULL COMMENT 'Classified as their league id' COLLATE 'utf8mb3_general_ci',
    `num_teams` INT(10) NOT NULL,
    `num_playoff_teams` INT(10) NULL DEFAULT NULL,
    `num_weeks` INT(10) NOT NULL,
    `rivalry_weeks` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
    `nut_cup_week` INT(10) NULL DEFAULT NULL,
    `avg_points` DECIMAL(20,6) NULL DEFAULT NULL,
    `avg_moves` DECIMAL(20,6) NULL DEFAULT NULL,
    `completed` TINYINT(3) NOT NULL DEFAULT '0',
    `create_date` DATETIME NULL DEFAULT 'CURRENT_TIMESTAMP',
    `modify_date` DATETIME NULL DEFAULT 'CURRENT_TIMESTAMP',
    PRIMARY KEY (`league_season_id`) USING BTREE,
    UNIQUE INDEX `league_id_season_id` (`league_id`, `season_id`) USING BTREE,
    INDEX `league_id` (`league_id`) USING BTREE,
    INDEX `season_id` (`season_id`) USING BTREE,
    INDEX `yahoo_league_season_id` (`yahoo_league_season_id`) USING BTREE
)
COLLATE='utf8mb3_general_ci'
ENGINE=InnoDB;

CREATE TABLE `seasons` (
    `season_id` INT(10) NOT NULL AUTO_INCREMENT,
    `yahoo_season_id` INT(10) NULL DEFAULT NULL,
    `name` YEAR NOT NULL,
    `start_date` DATE NOT NULL,
    `end_date` DATE NOT NULL,
    `create_date` DATETIME NULL DEFAULT 'CURRENT_TIMESTAMP',
    `modify_date` DATETIME NULL DEFAULT 'CURRENT_TIMESTAMP' ON UPDATE (CURRENT_TIMESTAMP),
    PRIMARY KEY (`season_id`) USING BTREE,
    UNIQUE INDEX `yahoo_season_id` (`yahoo_season_id`) USING BTREE
)
COLLATE='utf8mb3_general_ci'
ENGINE=InnoDB;

with the following code:

/// <summary>
/// Method that calculates league power rankings for a given season and returns a dictionary of manager_ids and power ranking score
/// </summary>
/// <param name="selectedLeague"></param>
/// <param name="year"></param>
/// <returns></returns>
public static Dictionary<int, double> CalculateLeaguePowerRankings(int selectedLeague, int? year = null)
int current_league_season_id = context.LeagueSeasons 
                .Include(ls => ls.Season)
                .Where(ls => ls.LeagueId == selectedLeague)
                .OrderByDescending(ls => ls.Season.Name)
                .Select(ls => ls.Id)
                .First();

Dictionary<int, double> power_rankings = Calculations.CalculateLeaguePowerRankings(selectedLeague, context.LeagueSeasons.Find(current_league_season_id).Season.Name);

However, the last line of that code throws the following exception with the Season relationship in that method parameter:

System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'System.String'.'

When I add the following code:

int current_season_id = context.LeagueSeasons
    .Include(ls => ls.Season)
    .Where(ls => ls.Id == current_league_season_id)
    .Select(ls => ls.SeasonId)
    .First();
    
Season current_season = context.Seasons.Find(current_season_id);

Both current_league_season_id and current_season_id are returning valid integers identifiers with records that can be found in the database. Additionally, the current_season_id is the season_id associated with my test current_league_season_id.

I've tried modifying the current_season query to use .Where(...).FirstOrDefault() instead of .Find() but the results are the same.

I have the following models:

[Table("league_seasons")]
public class LeagueSeason
{
    [Key]
    [Column("league_season_id")]
    public required int Id { get; set; }

    [ForeignKey("League")]
    [Column("league_id")]
    public required int LeagueId { get; set; }

    [ForeignKey("Season")]
    [Column("season_id")]
    public required int SeasonId { get; set; }

    [Column("yahoo_league_season_id")]
    public string? YahooLeagueSeasonId { get; set; }

    [Column("num_teams")]
    public required int NumTeams { get; set; }

    [Column("num_playoff_teams")]
    public int? NumPlayoffTeams { get; set; }

    [Column("num_weeks")]
    public required int NumWeeks { get; set; }

    [Column("rivalry_weeks")]
    public string? RivalryWeeks { get; set; }

    [Column("nut_cup_week")]
    public required int NutCupWeek { get; set; }

    [Column("avg_points")]
    public required double AvgPoints { get; set; }

    [Column("avg_moves")]
    public required double AvgMoves { get; set; }

    [Column("completed")]
    public required int Completed { get; set; }

    [Column("create_date")]
    public required DateTime CreateDate { get; set; }

    [Column("modify_date")]
    public required DateTime ModifyDate { get; set; }


    // Relationships
    public virtual required League League { get; set; }
    public virtual required Season Season { get; set; }
    public virtual required ICollection<Team> Teams { get; set; }
}

[Table("seasons")]
public class Season
{
    [Key]
    [Column("season_id")]
    public required int Id { get; set; }

    [Column("yahoo_season_id")]
    public int? YahooSeasonId { get; set; }

    [Column("name")]
    public required string Name { get; set; }

    [Column("start_date")]
    public required DateOnly StartDate { get; set; }

    [Column("end_date")]
    public required DateOnly EndDate { get; set; }

    [Column("create_date")]
    public required DateTime CreateDate { get; set; }

    [Column("modify_date")]
    public required DateTime ModifyDate { get; set; }

    // Relationships
    public virtual ICollection<LeagueSeason> LeagueSeasons { get; set; }

for the following tables in my database:

CREATE TABLE `league_seasons` (
    `league_season_id` INT(10) NOT NULL AUTO_INCREMENT,
    `league_id` INT(10) NOT NULL,
    `season_id` INT(10) NOT NULL,
    `yahoo_league_season_id` VARCHAR(50) NULL DEFAULT NULL COMMENT 'Classified as their league id' COLLATE 'utf8mb3_general_ci',
    `num_teams` INT(10) NOT NULL,
    `num_playoff_teams` INT(10) NULL DEFAULT NULL,
    `num_weeks` INT(10) NOT NULL,
    `rivalry_weeks` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
    `nut_cup_week` INT(10) NULL DEFAULT NULL,
    `avg_points` DECIMAL(20,6) NULL DEFAULT NULL,
    `avg_moves` DECIMAL(20,6) NULL DEFAULT NULL,
    `completed` TINYINT(3) NOT NULL DEFAULT '0',
    `create_date` DATETIME NULL DEFAULT 'CURRENT_TIMESTAMP',
    `modify_date` DATETIME NULL DEFAULT 'CURRENT_TIMESTAMP',
    PRIMARY KEY (`league_season_id`) USING BTREE,
    UNIQUE INDEX `league_id_season_id` (`league_id`, `season_id`) USING BTREE,
    INDEX `league_id` (`league_id`) USING BTREE,
    INDEX `season_id` (`season_id`) USING BTREE,
    INDEX `yahoo_league_season_id` (`yahoo_league_season_id`) USING BTREE
)
COLLATE='utf8mb3_general_ci'
ENGINE=InnoDB;

CREATE TABLE `seasons` (
    `season_id` INT(10) NOT NULL AUTO_INCREMENT,
    `yahoo_season_id` INT(10) NULL DEFAULT NULL,
    `name` YEAR NOT NULL,
    `start_date` DATE NOT NULL,
    `end_date` DATE NOT NULL,
    `create_date` DATETIME NULL DEFAULT 'CURRENT_TIMESTAMP',
    `modify_date` DATETIME NULL DEFAULT 'CURRENT_TIMESTAMP' ON UPDATE (CURRENT_TIMESTAMP),
    PRIMARY KEY (`season_id`) USING BTREE,
    UNIQUE INDEX `yahoo_season_id` (`yahoo_season_id`) USING BTREE
)
COLLATE='utf8mb3_general_ci'
ENGINE=InnoDB;

with the following code:

/// <summary>
/// Method that calculates league power rankings for a given season and returns a dictionary of manager_ids and power ranking score
/// </summary>
/// <param name="selectedLeague"></param>
/// <param name="year"></param>
/// <returns></returns>
public static Dictionary<int, double> CalculateLeaguePowerRankings(int selectedLeague, int? year = null)
int current_league_season_id = context.LeagueSeasons 
                .Include(ls => ls.Season)
                .Where(ls => ls.LeagueId == selectedLeague)
                .OrderByDescending(ls => ls.Season.Name)
                .Select(ls => ls.Id)
                .First();

Dictionary<int, double> power_rankings = Calculations.CalculateLeaguePowerRankings(selectedLeague, context.LeagueSeasons.Find(current_league_season_id).Season.Name);

However, the last line of that code throws the following exception with the Season relationship in that method parameter:

System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'System.String'.'

When I add the following code:

int current_season_id = context.LeagueSeasons
    .Include(ls => ls.Season)
    .Where(ls => ls.Id == current_league_season_id)
    .Select(ls => ls.SeasonId)
    .First();
    
Season current_season = context.Seasons.Find(current_season_id);

Both current_league_season_id and current_season_id are returning valid integers identifiers with records that can be found in the database. Additionally, the current_season_id is the season_id associated with my test current_league_season_id.

I've tried modifying the current_season query to use .Where(...).FirstOrDefault() instead of .Find() but the results are the same.

Share Improve this question edited Feb 6 at 21:21 Blake Wewer asked Feb 6 at 17:42 Blake WewerBlake Wewer 33 bronze badges New contributor Blake Wewer is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
Add a comment  | 

2 Answers 2

Reset to default 2
`name` YEAR NOT NULL,

[Column("name")]
public required string Name { get; set; }

You have defined the column as numeric in the database but as a string in your C#.

Change your DB schema to have name as a string.

arnt you getting the whole object (row of the table) back and not just the int

int current_league_season_id = context.LeagueSeasons....

make the item a var and than use current_league_season_id.league_season_id var current_league_season_id = context.LeagueSeasons...

发布评论

评论列表(0)

  1. 暂无评论