簡體   English   中英

Entity Framework Core 從存儲過程中獲取數據,然后在沒有 DbSet 的情況下轉換為視圖模型

[英]Entity Framework Core get data from stored procedure and then convert into view model without DbSet

我在存儲庫中有一個函數GetForms ,該函數的目的是調用存儲過程並返回包含數據的行。 到目前為止一切正常。

功能

public IEnumerable<FormBO> GetForms() 
{
      var id = "1"
      var Query= _context.FormBO.FromSqlRaw("dbo.SP_Core  @pin_ID={0}", id)
                                .AsNoTracking().ToList(); //3K line of sp
      return Query;
}

模型

public class FormBO
{
    [Key]
    public int? ID { get; set; }
    public int? secondid { get; set; }
    ......
}

數據庫上下文

添加了這段代碼,所以上下文認為它是數據庫中的一個表,我不必做更多的事情

 public virtual DbSet<FormBO> FormBO { get; set; }

問題

每當我們構建數據庫和 db 上下文時,它都會重新生成所有文件和代碼,因此它刪除了

  public virtual DbSet<FormBO> FormBO { get; set; }

我們必須手動添加這一行,有什么辦法可以改變邏輯,所以每次 dba 更新數據庫時,我都不DBset<FormBO>此代碼( DBset<FormBO> )添加到DbContext ...

我發現了什么

我發現如果我將模型更改為 ".Database" 並將FromSqlRawExecuteSqlRaw ,但它只是將計數返回為 int 而不是行列表。

public IEnumerable<FormBO> GetForms() 
{
    var id = "1"
    var Query = _context.Database.ExecuteSqlRaw("dbo.SP_Core  @pin_ID={0}", id)
                                 .AsNoTracking().ToList(); //3K line of sp
     return Query;
}

如果可能的DBSet ,每當我們更新我認為我們無法做到的代碼時,它會自動將DBSet添加到上下文中。

或者

獲取沒有 dbset 模型的查詢結果,然后我將使用 foreach 循環將其添加到 FormBO 模型中,它只有 10 行

由於該表實際上並不存在於數據庫中,因此內置的腳手架過程不會嘗試創建它。

但是,您可能可以使用擴展RelationalScaffoldingModelFactory的實現替換IScaffoldingModelFactory服務,並使用代碼優先的 fluent api 為實際上並不存在的表定義元數據。

您可能可以使用這種類型的方法為數據庫中的所有表值定義類型。 由於 EF Core 5 增加了對表值的支持,也許他們會為你做這件事,但我還沒有測試過。

public class MyModelFactory : RelationalScaffoldingModelFactory
{
    public MyModelFactory(
        IOperationReporter reporter, 
        ICandidateNamingService candidateNamingService, 
        IPluralizer pluralizer, 
        ICSharpUtilities cSharpUtilities, 
        IScaffoldingTypeMapper scaffoldingTypeMapper, 
        LoggingDefinitions loggingDefinitions) 
    : base(reporter, candidateNamingService, pluralizer, cSharpUtilities, scaffoldingTypeMapper, loggingDefinitions)
    {
    }

    protected override ModelBuilder VisitDatabaseModel(ModelBuilder modelBuilder, DatabaseModel databaseModel)
    {
        modelBuilder.Entity<FormBO>(entity =>
        {
            // ...
        });

        return base.VisitDatabaseModel(modelBuilder, databaseModel);
    }
}

    services.AddDbContextPool<ContextType>(o =>
    {
        o.ReplaceService<IScaffoldingModelFactory, MyModelFactory>();
        // ...
    });

當然也有一個簡單的答案。 腳手架上下文是一個部分類。 只需在另一個源文件中定義其他 DbSet。

暫無
暫無

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

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