[英]EF Core: How to query a SQL View
我的數據庫中有一個名為“dbo.Viewtest”的 SQL 視圖。 此視圖組合了其他 2 個具有相同列類型的表的數據。 該視圖還添加了一列以顯示數據源自哪個表。
這是 SQL Server 對象資源管理器中 SQL 視圖的樣子:
身份證 | 類型 | 內容 | 地點
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
屬性上,但在組合兩個表時,您的VIEW
在Id
列中生成重復值。 然后 EF Core 可能會“啊,又是Id
=1,我已經有了那行,所以我會重用它”。
有三種可能的修復方法:
(1)為保證生成唯一值的 VIEW 定義一個單獨的列,然后在 EF Core 中使用該列作為[Key]
。
要么
(2)保持 VIEW 原樣,然后在 EF Core 中定義一個復合主鍵。 請注意,EF Core 不支持使用[Key]
屬性創建復合鍵,您需要使用 Fluent API HasKey()
函數,在這種情況下用於Location
和Id
屬性。
要么
(3)完全省略[Key]
,您可能實際上並不需要它,如此處的文檔中所述: Keyless Entity Types 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.