簡體   English   中英

Scaffold-DbContext SQL 視圖? ASP 網絡核心 3.1

[英]Scaffold-DbContext SQL Views ? ASP NET CORE 3.1

我需要你的幫助。 我在網上讀到,從來沒有一種正確的方法可以將 sql 中的視圖導入到我們的 asp.net 核心項目中。 你知道在 3.1 版本中你能不能做到? 如果是這樣,如何? 對於表,我使用“scaffold-DbContext”命令。 非常感謝!

盡管您不能將 scaffold-DbContext 用於數據庫視圖,但您仍然可以在 .Net Core 項目中使用 SQL 視圖。

假設您有以下 SQL 視圖

CREATE VIEW [dbo].[v_MyTableResult] AS

SELECT 
    SELECT Id, Name FROM MyTable

GO

根據 SQL View 的結果集創建一個新的 Model 類。

public class MyTableModel
{
    public int Id { get; set; }
    public string Name { get; set; }
}

在數據庫上下文類中,為模型引入屬性。

public virtual DbSet<MyTableModel> MyTableResults { get; set; }

在 OnModelCreating 方法中,配置模型屬性

    modelBuilder.Entity<MyTableModel>(entity =>
    {
        entity.HasNoKey();

        entity.Property(e => e.Id)
            .HasColumnName("Id");

        entity.Property(e => e.Name)
            .HasColumnName("Name");
    });

最后,在需要視圖結果的方法中,在 DbSet 屬性上調用 FromSqlRaw

    var myTableResults =
        this.MyDbContext.MyTableResults.FromSqlRaw(
            "SELECT * FROM dbo.v_MyTableResult").ToList();

好像還不支持。 有關解決方法,您可以參考

是否可以在 Entity Framework Core 2.1 版上自動映射數據庫視圖?

可能的腳手架視圖。 只需像搭建表一樣使用 -Tables,只使用視圖的名稱。 例如,如果您的視圖名稱是“vw_inventory”,則在包管理器控制台中運行此命令(將您自己的信息替換為“我的...”):

PM> Scaffold-DbContext "Server=MyServer;Database=MyDatabase;user id=MyUserId;password=MyPassword" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Temp -Tables vw_inventory

此命令將在項目的 Temp 目錄中創建模型文件和上下文文件。 您可以將模型文件移動到您的模型目錄中(記得更改命名空間名稱)。 您可以從上下文文件中復制您需要的內容並將其粘貼到項目中相應的現有上下文文件中。

注意:如果您想在使用本地數據庫的集成測試中使用您的視圖,您需要將視圖創建為數據庫設置的一部分。 如果您要在多個測試中使用該視圖,請確保添加對視圖存在的檢查。 在這種情況下,由於 SQL 'Create View' 語句需要是批處理中的唯一語句,因此您需要在存在檢查語句中將創建視圖作為動態 Sql 運行。 或者,您可以運行單獨的“如果存在刪除視圖...”,然后運行“創建視圖”語句,但如果多個測試同時運行,您不希望在另一個測試正在使用視圖時刪除該視圖。 例子:

  void setupDb() {
    ...
    SomeDb.Command(db => db.Database.ExecuteSqlRaw(CreateInventoryView()));
    ...
  }
  public string CreateInventoryView() => @"
  IF OBJECT_ID('[dbo].[vw_inventory]') IS NULL
    BEGIN EXEC('CREATE VIEW [dbo].[vw_inventory] AS
       SELECT ...')
    END";

這是一個有用的鏈接。 它描述了手動添加代碼部分(如 Nouman 提到的)而不是搭建它們: https ://docs.microsoft.com/en-us/ef/core/modeling/keyless-entity-types?tabs=fluent-api

是的,我們可以將scaffold-DbContext 與 view 一起使用

使用 scaffold-DbContext 進行數據庫視圖 (myview)。 我在腳手架-DbContext 查詢下執行。

Scaffold-DbContext“數據源=my_server,1433;初始目錄=my_database;用戶ID=my_user;密碼=my_password;” Microsoft.EntityFrameworkCore.SqlServer -o 實體 -Context ContextName -t myview -f

執行后,您將獲得實體類和上下文文件。

實體類 (myview.cs) 中的代碼

////// Fetching data
public partial class myview
{ 
    public Guid property_1 { get; set; }
    
}

dbcontect 文件(ContextName.cs) 中的代碼

public partial class ContextName : DbContext
{
    public virtual DbSet<myview> myview { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<myview>(entity =>
        {
            entity.HasNoKey();

            entity.ToView("myview", "ExtIntDWFS");

            ////// other property configuration.
        }
    }
}

控制器中獲取視圖數據的代碼

////// Fetching data
public async Task<myview> GetView(Base @base)
    {
        myview obj = new myview();

        using (ContextName context = new ContextName())
        {
            obj = await context.myview.Select(s => new myview
                                              {
                                                  property_1 = s.property_1,
                                              }).FirstOrDefaultAsync();
        }

        return obj;
    }

上面的代碼成功地為我工作。

我最近有一個類似的需求(檢索一個或多個視圖並在 .NET 項目中創建相應的類)。 可以使用Scaffold-DbContect來完成,例如:

Scaffold-DbContext "Server=<address>;
Database=<dbname>;
Trusted_Connection=True" 
Microsoft.EntityFrameworkCore.SqlServer -OutputDir
ModelDirectory -t <table_name> -t <view_name>

它創建一個名為OutputDir的文件夾, OutputDir包含指定表或視圖的相應類

暫無
暫無

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

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