亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

.NET Core 實體框架 InvalidOperationException

.NET Core 實體框架 InvalidOperationException

C#
慕田峪7331174 2022-06-12 14:32:55
我有一個簡單的模型[Table("InterfaceType")]public class InterfaceType{    [Key]    public int InterfaceTypeId { get; set; }    public string Description { get; set; }}在我的 DbContextpublic DbSet<InterfaceType> InterfaceTypes { get; set; }在我的控制器中List<InterfaceType> types = _context.InterfaceTypes.FromSql(            "SELECT * FROM [Interfaces].[Control].[InterfaceType]").ToList();哪個返回錯誤:InvalidOperationException:“FromSql”操作的結果中不存在所需的列“InterfaceID”。我在與此類似的其他方法中使用 FromSql 沒有問題,盡管這些模型確實包含 InterfaceId。為什么此操作在模型中不存在時需要一個 InterfaceId。我也嘗試了以下相同的結果。List<InterfaceType> types = _context.InterfaceTypes.FromSql(            "SELECT InterfaceTypeId, Description FROM [Interfaces].[Control].[InterfaceType]").ToList();我也試過:interfacesOverview.SelectedInterface.InterfaceTypes = _context.InterfaceTypes.ToList();通過 fluent api 聲明后: protected override void OnModelCreating(ModelBuilder modelBuilder)    {       modelBuilder.Entity<InterfaceType>().ToTable("InterfaceType", "Control");    }結果相同。為了清楚起見,這里是 MSSQL 中的表:    CREATE TABLE [Control].[InterfaceType](    [InterfaceTypeId] [tinyint] NOT NULL,    [Description] [varchar](25) NULL, CONSTRAINT [PK_InterfaceType] PRIMARY KEY CLUSTERED (    [InterfaceTypeId] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]更新我查看了 EF 生成的 SQL:    SELECT [i].[InterfaceTypeId], [i].[Description], [i].[InterfaceID] FROM [Control].[InterfaceType] AS [i]它從哪里獲取 InterfaceID?
查看完整描述

3 回答

?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

它從哪里獲取 InterfaceID?


首先,應該清楚它不是來自所示的“簡單”(但顯然不完整)模型。


EF生成的SQL清楚地表明你沒有重命名PK屬性生成的列,也沒有Discriminator列,所以它不能來自繼承。而且您明確定義了一個名為的影子屬性InterfaceID而沒有注意到它的可能性很小。


所有這一切,以及該名稱與 FK 屬性/列名稱的 EF Core 常規名稱之一相匹配的事實InterfaceID清楚地表明了由關系引入的常規 FK。例如有這樣的第二個模型:


public class Interface

{

    public int ID { get; set; }

    // or

    // public int InterfaceID { get; set; }

    public ICollection<InterfaceType> InterfaceTypes { get; set; }

}

如關系 - 單一導航屬性EF Core 文檔主題中所述:


僅包含一個導航屬性(沒有反向導航,也沒有外鍵屬性)就足以具有約定定義的關系。


并且隨附的示例顯示了Blog/Post模型,其中僅突出顯示了public List<Post> Posts { get; set; }屬性。Blog


所有 EF Core 運行時行為都基于模型元數據。數據庫的結構是什么并不重要,更重要的是 EF Core 認為它基于您的模型類、數據注釋和流暢的配置,以及是否與數據庫架構匹配。更簡單的檢查方法是生成遷移并檢查它是否與數據庫模式匹配。


因此,如果關系是有意的,那么您必須更新數據庫以匹配您的模型。否則,您需要更新模型以匹配數據庫 - 通過刪除或忽略集合導航屬性(或更正導致差異的無效數據注釋/流暢配置)。


查看完整回答
反對 回復 2022-06-12
?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

我對這個問題的理解是,EF 在您的模型類中創建了一個影子屬性 ,可能是通過在您的Interface模型中部分發現的關系。

此外,我覺得 EFCore 使用的 ModelSnapshot 與數據庫中表的真實狀態(可能是掛起的遷移)之間存在不匹配。仔細檢查您的InterfaceTypein <YourDbContext>ModelSnapshot.cs,并檢查是否缺少您的財產。


查看完整回答
反對 回復 2022-06-12
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

我的猜測是,您還在上下文中注冊了一個“接口”表,該表包含對 InterfaceType 的引用。Interface 將聲明一個 InterfaceTypeId 字段,但是對于 EF,如果您將 HasOne 與 ForeignKey 一起使用,請檢查您是否意外分配了以下內容:

.HasOne(x => x.InterfaceType).WithOne().HasForeignKey<InterfaceType>("InterfaceId");

在具有 InterfaceType 的接口的情況下,它將被映射得更像:

.HasOne(x => x.InterfaceType).WithMany();

這可能已經潛入您的其他關聯實體之一。通常這些是自動完成選擇錯誤類型而您沒有注意到的錯別字。如果您的任何類上都存在該映射,則 EF 將期望在 InterfaceType 上找到一個 InterfaceId 列。搜索一下HasForeignKey<InterfaceType>,看看有沒有什么不尋常的地方。


查看完整回答
反對 回復 2022-06-12
  • 3 回答
  • 0 關注
  • 251 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號