據說,我有一個簡單DbContext的 withBlog和Post模型:
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public ICollection<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
假設我有一個回傳一些 DTO 的存盤程序:
[Keyless]
public class BlogPostDto
{
public string PostTitle { get; init; }
public string BlogName { get; init; }
}
今天我將以下內容放入DbContext:
public class AppDbContext : DbContext {
public virtual DbSet<BlogPostDto> NeverUseIt { get; set; }
partial void OnModelCreatingPartial(ModelBuilder modelBuilder) {
modelBuilder.Entity<BlogPostDto>().ToView(null);
}
}
然后我可以按照我想要的方式獲得存盤程序結果:
List<BlogPostDto> results = await db.Set<BlogPostDto>().FromSqlRaw($"EXEC MyProc").ToListAsync();
所以,我的問題是,我必須添加我的BlogPostDto到DbContext嗎?我知道在 EF Core 3 中我做到了;但從那以后有大量的改進。創建一個虛假的 DbSet 并將其映射到不存在的視圖只是感覺違反直覺!
我在最新檔案中找到的最接近的是這里。背景關系的第一個示例是作為原始 SQL 查詢的回傳型別。- 但本文假設我在資料庫中已經有一個匹配的視圖。
更新:看起來ToView(null)沒有必要 - 只是DbSet<>
uj5u.com熱心網友回復:
到目前為止,與您在 EF Core 6.0 檔案和您所指的 SO 帖子中看到的內容相比,這方面沒有任何變化。
為了清楚起見,您不需要在您的背景關系中DbSet<T>回傳屬性。但是您確實需要使用呼叫在模型中包含型別(無論是否無密鑰) ,并且還需要防止 EF Core 遷移將資料庫表和/或視圖與其關聯,并且可以選擇在您不想使用 EF Core 的情況下資料類中的依賴屬性。modelBuilder.Entity<T>()ToView(null) HasNoKey()[Keyless]
所以你的例子的最低要求是這一行
modelBuilder.Entity<BlogPostDto>().ToView(null);
現在,這是一個長期請求的功能(它存在于“現代”EF Core 應該替換的“過時”EF6 中),由支持原始 SQL 查詢跟蹤,而不為EF 中的結果 #10753 問題定義物體型別核心問題跟蹤器。它最初計劃包含在即將發布的 EF Core 7.0版本(2022 年 11 月)中,但后來(最終)在 EF Core 8.0(2023 年 11 月)中被刪減。因此,在此之前,您必須使用“注冊模型”方法,或者使用像 Dapper 這樣的 3rd 方庫(!)來完成相同的任務,正如 EF Core 團隊成員之一(?!)所建議的那樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/506998.html
上一篇:檢查物體框架中是否有0行
下一篇:從Linqpad中的結果構建模型
