首页 > 解决方案 > 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)
     },

如果没有这种表创建行为,我如何调用我的存储过程?

标签: asp.net-corestored-proceduresentity-framework-core

解决方案


灵感来源:在实体框架核心中执行存储过程,而不需要映射到 dbset

[Keyless] 仅指定一个没有主键的表 - 因此您需要在模型创建上更进一步,告诉它不要创建后备表:

  1. 从您的上下文中删除该DbSet<MyModel>属性(您可能可以离开它,但它会令人困惑,因为它没有表格支持......)
  2. 在上下文的 OnModelCreating 中,注册和/或操作MyModel
modelBuilder.Entity<MyModel>().HasNoKey().ToView(null);
  1. 使用以下内容填充模型:
CustomerList = Context.Set<MyModel>().FromSql($"MySproc").ToList();

推荐阅读