[英]execute stored procedure in entity Framework Core without expecting map to 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" 並將FromSqlRaw
為ExecuteSqlRaw
,但它只是將計數返回為 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.