我在存储库中有一个函数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
。。。
我发现了什么
我发现如果我把模型改成";。数据库";以及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模型的情况下获得查询结果,然后我将使用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。