簡體   English   中英

EF Core:如何查詢 SQL 視圖

[英]EF Core: How to query a SQL View

我的數據庫中有一個名為“dbo.Viewtest”的 SQL 視圖。 此視圖組合了其他 2 個具有相同列類型的表的數據。 該視圖還添加了一列以顯示數據源自哪個表。

這是 SQL Server 對象資源管理器中 SQL 視圖的樣子:

dbo.ViewTest

身份證 | 類型 | 內容 | 地點

1 | H1 | 歡迎!|

2 | p | 登錄 |

3 | h2 | 指南 |

1 | H1 | 信息 | 活動

2 | p | 關注 | 活動

該視圖由 2 個表創建,其中一個稱為“HomeContent”,另一個稱為“EventsContent”(因此是位置列)。 使用以下代碼創建了視圖:

protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.Sql("CREATE VIEW ViewTest AS " +
                "SELECT Id, Type, Content, 'Home' location FROM HomeContent UNION ALL " +
                "SELECT Id, Type, Content, 'Evenementen' FROM EvenementenContent");

        }

然后我添加了一個模型類,如下所示:

  [Table("ViewTest")]
    public class TestViewContent
    {
        [Key]
        public int Id { get; set; }
        public string Type { get; set; }
        public string Content { get; set; }
        public string Location { get; set; }
    }

最后,我將它添加到我的 DbContext 中:

 public DbSet<TestViewContent> TestViewContent { get; set; }

現在,事情開始破裂了。 當我嘗試使用 EF Core 顯示此 SQL 視圖時,我得到以下損壞的輸出:

身份證 | 類型 | 內容 | 地點

1 | H1 | 歡迎!|

2 | p | 登錄 |

3 | h2 | 指南 |

1 | H1 | 歡迎 |

2 | p | 登錄 |

如您所見,無論出於何種原因,當我嘗試顯示 SQL 視圖時,當應該顯示“事件”表中的數據時,數據會“循環”。 因此,無論出於何種原因,它只顯示主表中的數據。

我用於顯示 SQL 視圖的代碼是:

 private readonly DbApplicationContext_context;

        public TestViewContentController(DbApplicationContext_context)
        {
            _context = context;
        }

   public async Task<IActionResult> Index()
        {
            return View(await _context.TestViewContent.ToListAsync());
        }

有沒有人可以幫助我? 如果無法顯示 SQL 視圖,有沒有人知道組合多個表並添加“位置”列以跟蹤數據來源的表的更好方法? 任何幫助將不勝感激!

發生這種情況是因為您將[Key]放在Id屬性上,但在組合兩個表時,您的VIEWId列中生成重復值。 然后 EF Core 可能會“啊,又是Id =1,我已經有了那行,所以我會重用它”。

有三種可能的修復方法:

(1)為保證生成唯一值的 VIEW 定義一個單獨的列,然后在 EF Core 中使用該列作為[Key]

要么

(2)保持 VIEW 原樣,然后在 EF Core 中定義一個復合主鍵 請注意,EF Core 不支持使用[Key]屬性創建復合鍵,您需要使用 Fluent API HasKey()函數,在這種情況下用於LocationId屬性。

要么

(3)完全省略[Key] ,您可能實際上並不需要它,如此處的文檔中所述: Keyless Entity Types

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM