【发布时间】:2020-11-23 23:57:37
【问题描述】:
我在存储库中有一个函数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...
我发现了什么
我发现如果我将模型更改为“.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 模型的情况下获取查询结果,然后我将使用 foreach 循环将其添加到 FormBO 模型中,它只有 10 行
【问题讨论】:
-
您可以尝试将您的额外实体放在部分类中,但我不会“每次 dba 更新数据库”时为脚手架。我当然更喜欢手动更新实体,而不是使用新的脚手架松散所有自定义。
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀!
标签: c# entity-framework-core asp.net-core-3.1