实体框架核心从存储过程中获取数据,然后在没有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; }
......
}

DbContext

添加了这段代码,所以上下文认为它是数据库中的一个表,我不需要做更多的事情

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

问题

每当我们构建数据库和数据库上下文时,它都会重新生成所有文件和代码,因此它会删除

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

我们必须手动添加这一行,是否有任何方法可以更改逻辑,所以我不必每次dba更新数据库时都将此代码(DBset<FormBO>(添加到DbContext。。。

我发现了什么

我发现如果我把模型改成";。数据库";以及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模型的情况下获得查询结果,然后我将使用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>();
// ...
});

当然也有一个简单的答案。scaffolded上下文是一个分部类。只需在另一个源文件中定义另一个DbSet。

相关内容

  • 没有找到相关文章

最新更新