asp.net-core - EFCore 从用于调用 SPROC 的数据模型创建不必要的表,
问题描述
我正在使用 MVC/Razor/WebAPI 应用程序中的实体框架核心从 asp.net 核心调用 sprocs。如果这是 nube,较新的开发人员非常抱歉。我已经阅读了我在 EF 的存储过程中可以找到的所有内容......
问题: 当我将我的应用程序设置为调用存储过程时,EF Core 会更新我的数据库(通过我运行的下一次迁移)以根据我创建的模型创建一个空表,以从存储过程中检索输出。
示例:我有一个返回两列的存储过程
SELECT customerID, customerName from MyTable
我使用 [Keyless] 指令添加了一个简单的 POCO MyModel
namespace MyApp.Models
{
[Keyless]
public class MyModel
{
public int customerID { get; set; }
public string customerName { get; set; }
}
}
然后我在我的 ApplicationDBContext 中注册该类
public virtual DbSet<MyModel> MyModel { get; set; }
我现在可以使用以下方法从我的页面调用存储过程:
public List<MyModel> CustomerList { get; set; }
和
CustomerList = _context.MySproc
.FromSqlRaw($"MySproc")
.ToList();
当我下次运行迁移时,EF 添加迁移代码以基于我的模型创建一个表,我认为我不需要。
migrationBuilder.CreateTable(
name: "VerifyEmailAndStripeCustomerID",
columns: table => new
{
customerID = table.Column<int>(type: "int", nullable: false),
customerName = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: true)
},
如果没有这种表创建行为,我如何调用我的存储过程?
解决方案
灵感来源:在实体框架核心中执行存储过程,而不需要映射到 dbset
[Keyless] 仅指定一个没有主键的表 - 因此您需要在模型创建上更进一步,告诉它不要创建后备表:
- 从您的上下文中删除该
DbSet<MyModel>
属性(您可能可以离开它,但它会令人困惑,因为它没有表格支持......) - 在上下文的 OnModelCreating 中,注册和/或操作
MyModel
modelBuilder.Entity<MyModel>().HasNoKey().ToView(null);
- 使用以下内容填充模型:
CustomerList = Context.Set<MyModel>().FromSql($"MySproc").ToList();
推荐阅读
- html - 需要一些帮助 HTML/CSS
- typescript - 元组类型中的 IntelliSense
- python - 如何对python中的许多彩色图像进行直方图均衡?
- amazon-web-services - RDS 数据库实例属性 - MasterUserPassword
- c# - Active Directory 中的显示名称未正确更新
- c++ - 我收到分段错误但不知道分段错误发生在哪里
- java - 为什么 java Stream.sorted() 给出不同的结果?
- swift - SwiftUI UIViewRepresentable - UITextView 检测带有属性文本的更改
- java - 使用 Comparator 对 Student 类型的 ArrayList 进行选择排序(在这种情况下不能使用 Collections.sort 方法)
- java - 为什么 c++ 程序员更喜欢前缀 ++ 而 java 程序员更喜欢后缀 ++?