![](/img/trans.png)
[英]MissingMethodException after upgrading to ASP.NET Core 2.0
[英]'Invalid Column Name' Error After Upgrading from Asp.net core 2.0 to 2.1
我最近重新訪問了我的 web 站點,不得不從 ASP.net MVC (DBF) 核心 2.0 升級到 2.1。 由於這樣做,我收到以下錯誤...
SqlException:列名“MovieTitleId”無效。 列名“MovieTitleId”無效。
然而,在我的代碼或數據庫的任何部分都沒有這樣的字段“MovieTitleId”。
該錯誤僅在站點訪問“多表”場景時發生(在數據庫中與 FK 建立了一對多關系。電影 > 場景)
這是場景 class..
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; }
}
這是電影 class ,它在“一側”並在典型的“主/細節”類型 web 頁面上調用場景......
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”。 錯誤消息是否以某種方式連接了 model 'Movie' 和列 'TitleId' ?
嘗試為您的外鍵添加虛擬關鍵字。 此外,ForeignKey Data Annotation 應該在您聲明虛擬屬性的那個屬性上,如下所示。 所以它應該是這樣的:
場景.cs
public int TitleId { get; set; }
[ForeignKey("TitleId")
public virtual Movie Movie { get; set; }
為什么是虛擬的?
如果您將您的屬性聲明為虛擬,則在查詢主 object 時將不會立即加載您的虛擬屬性(默認情況下)。 僅當您嘗試訪問它時才會從數據庫中檢索它。 這稱為延遲加載。
如果您想詳細了解為什么要使用virtual ,可以訪問此鏈接: 為什么 EF Code First 中的外鍵標記為 virtual?
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.