【问题标题】:Invalid Column Name Error When Accessing Navigation Properties From View从视图访问导航属性时出现无效的列名错误
【发布时间】:2016-02-15 22:19:14
【问题描述】:

当调用显示我已扩展的 ASP.NET 的 ApplicationUser 类的属性的视图时,当代码尝试呈现我潜入 ApplicationUser 类的行时,我收到以下错误:

@model BaseballStatTracker.Models.ApplicationUser

@foreach (var stats in Model.GameStatistics)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => stat.Game.GameTime)
        </td>
    </tr>
}

...原因:

从“游戏”属性中访问的任何属性都会导致错误,并且 Razor 在编辑视图时不会给出任何提示。只需访问 GameStatistics 上的常规属性即可。

我有两种情况;包含 Game 和 GameStatistics 实体的标准 ApplicationDbContext 和我的 GamesContext。我已经根据以下内容覆盖了 GamesContext 上的 OnModelCreating 方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Game>().HasKey(i => i.GameId);
            modelBuilder.Entity<Game>().HasOptional(i => i.HomeTeam).WithMany(i => i.HomeGames).HasForeignKey(i => i.HomeTeamId);
            modelBuilder.Entity<Game>().HasOptional(i => i.AwayTeam).WithMany(i => i.AwayGames).HasForeignKey(i => i.AwayTeamId);
            modelBuilder.Entity<Game>().HasOptional(i => i.Diamond).WithMany(i => i.Games).HasForeignKey(i => i.DiamondId);

            modelBuilder.Entity<GameStatistics>().HasKey(i => i.GameStatisticsId);
            modelBuilder.Entity<GameStatistics>().HasRequired(i => i.Game).WithMany(i => i.GameStatistics).HasForeignKey(i => i.GameId);
            modelBuilder.Entity<GameStatistics>().HasRequired(i => i.Player).WithMany(i => i.GameStatistics).HasForeignKey(i => i.PlayerId);
...
}

ApplicationUser、Game 和 GameStatistics 类如下所示:

应用程序用户:

public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }

        [Required]
        [Display(Name = "First Name")]
        [StringLength(155, ErrorMessage = "First Name can only be max 155 characters in length.")]
        public string FirstName { get; set; }

        [Display(Name = "Last Name")]
        [StringLength(155, ErrorMessage = "Last Name can only be max 155 characters in length.")]
        public string LastName { get; set; }

        [Display(Name = "Full Name")]
        public string FullName
        {
            get
            {
                return FirstName + " " + LastName;
            }
        }

        [Display(Name = "Player Number")]
        public int PlayerNumber { get; set; }

        [Display(Name = "Team")]
        public virtual Guid TeamId { get; set; }
        public virtual Team Team { get; set; }

        public virtual ICollection<GameStatistics> GameStatistics { get; set; }
    }

游戏:

public class Game
    {
        [Key]
        public Guid GameId { get; set; }

        public string GameName { get
            {
                return AwayTeam.Name + " @ " + HomeTeam.Name + ", " + GameDate.Value.Date.ToLongDateString();
            } }

        [DataType(DataType.Date)]
        [Display(Name = "Game Date")]
        public DateTime? GameDate { get; set; }

        [DataType(DataType.Time)]
        [Display(Name = "Game Time")]
        public DateTime? GameTime { get; set; }

        [Display(Name = "Game Location")]
        public virtual Guid? DiamondId { get; set; }
        public virtual Diamond Diamond { get; set; }

        [Display(Name = "Home Team")]
        public virtual Guid? HomeTeamId { get; set; }
        public virtual Team HomeTeam { get; set; }

        [Display(Name = "Away Team")]
        public virtual Guid? AwayTeamId { get; set; }
        public virtual Team AwayTeam { get; set; }

        public virtual ICollection<GameStatistics> GameStatistics { get; set; }
    }

游戏统计:

public class GameStatistics
    {
        [Key]
        public Guid GameStatisticsId { get; set; }

        public Guid GameId { get; set; }
        public virtual Game Game { get; set; }

        public string PlayerId { get; set; }
        public virtual ApplicationUser Player { get; set; }

        public int AtBats { get; set; }

        public int Hits { get; set; }

        public int Walks { get; set; }
    }

我尝试重做 OnModelCreate 方法,但我看不出我在 Game

【问题讨论】:

  • 您可以尝试为属性HomeTeamId、`AwayTeamId` 和不同的TeamId手动指定正确的列名

标签: c# asp.net entity-framework razor ef-code-first


【解决方案1】:

在我的 Games 模型的 HomeTeam 和 AwayTeam 属性上添加几个“反向属性”注释后,此问题已得到解决。我也不再使用 OnModelCreating 覆盖,而是完全使用注释。代码更改的相关部分是:

    [Display(Name = "Home Team")]
    public virtual Guid? HomeTeamId { get; set; }

    [ForeignKey("HomeTeamId")]
    [InverseProperty("HomeGames")] // Added this - 
    public virtual Team HomeTeam { get; set; }

    [Display(Name = "Away Team")]
    public virtual Guid? AwayTeamId { get; set; }

    [ForeignKey("AwayTeamId")]
    [InverseProperty("AwayGames")] // Added this - 
    public virtual Team AwayTeam { get; set; }

我不确定为什么在数据上下文中设置配置时无法获得相同的结果 - 我确信这只是我的一个误解,但我很想知道原因。 EF 不应该通过配置知道逆属性是什么吗?

我曾尝试更改配置设置,但没有任何效果 - 但是,我一开始看不出它有什么问题。不过,它现在正在使用数据注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多