【问题标题】:'Invalid Column Name' Error After Upgrading from Asp.net core 2.0 to 2.1从 Asp.net core 2.0 升级到 2.1 后出现“无效的列名”错误
【发布时间】:2020-07-07 19:22:51
【问题描述】:

我最近重新访问了我的网站,不得不从 ASP.net MVC (DBF) 核心 2.0 升级到 2.1。 由于这样做,我收到以下错误...

SqlException:列名“MovieTitleId”无效。列名“MovieTitleId”无效。

但在我的代码或数据库的任何部分中都没有“MovieTitleId”这样的字段。

该错误仅在站点访问“多表”场景时发生 (在数据库中与 FK 建立了一对多的关系。电影 > 场景)

这是场景类..

public partial class Scene
    {
        [Key]
        public int SceneId { get; set; }
        [ForeignKey("TitleId")]
        public int? TitleId { get; set; } // foreign key from Movie
        [ForeignKey("LocationSiteId")]
        public int? LocationSiteId { get; set; }
        [ForeignKey("LocationAliasId")]
        public int? LocationAliasId { get; set; }
        public string Notes { get; set; }
        public int? SceneOrder { get; set; }
        public string TitleList { get; set; }
        public LocationAlias LocationAlias { get; set; }
        public LocationSite LocationSite { get; set; }
        public Movie Movie { get; set; }
    } 

这是电影类,它在“一侧”并在典型的“主/细节”类型的网页上调用场景......

public partial class Movie
    {
        public Movie()
        {
            Scenes = new HashSet<Scene>();
        }

        [Key]
        public int TitleId { get; set; }
        [Required]
        public string Title { get; set; }
        [DisplayName("Title")]
        public string ParsedTitle { get; set; }
        [DisplayName("Year")]
        public int? TitleYear { get; set; }        
        public string ImdbUrl { get; set; }
        public string Summary { get; set; }
        public bool? ExcludeTitle { get; set; }
        public bool? Widescreen { get; set; }


         [DisplayName("Title")]
        public override string ToString() 
        {
            return Title + " (" + TitleYear + ")";
           
        }

       public ICollection<Scene> Scenes { get; set; }
        
    }

MoviesController.cs 中出现错误...

 Movie movie = _context.Movies.Find(id);
            ViewBag.Scenes = _context.Scenes
                .Where(s => s.TitleId == id)
                .Include(s => s.LocationSite)
                .Include(s => s.LocationSite.LocationPlace)
                .OrderBy(s => s.SceneOrder).ToList(); 

在我升级到核心 2.1 之前,一切正常。 我什至不记得曾经有一个名为“MovietitleId”的字段实际上是“TitleId”。 错误消息是否以某种方式连接了模型“电影”和列“TitleId”?

【问题讨论】:

  • 你的View 里有什么东西会扔这个吗?我已经有一段时间没有完成 MVC 代码了。
  • 如果可能,请显示分享您的模型快照

标签: c# sql asp.net-core


【解决方案1】:

尝试为您的外键添加 virtual 关键字。此外,ForeignKey Data Annotation 应该在您声明虚拟属性的那个属性上,如下所示。所以应该是这样的:

场景.cs

public int TitleId { get; set; }
[ForeignKey("TitleId")
public virtual Movie Movie { get; set; }

为什么是虚拟的?

如果您将属性声明为虚拟,则在查询主对象时不会立即加载您的虚拟属性(默认情况下)。仅当您尝试访问它时才会从数据库中检索它。这称为延迟加载。

如果您想详细了解为什么要使用virtual,可以访问此链接:Why are foreign keys in EF Code First marked as virtual?

希望这会有所帮助。

【讨论】:

  • 太棒了!那已经解决了。非常感谢。我会阅读你的链接。干杯
  • @KevinM 我很高兴它有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
相关资源
最近更新 更多