【问题标题】:ASP.NET Core: DbSet to executing raw stored procedureASP.NET Core:用于执行原始存储过程的 DbSet
【发布时间】:2019-08-01 10:49:28
【问题描述】:

我正在使用 ASP.NET Core 2.0 和剃须刀页面。 SQL 表没有主键,我将无法更改 SQL 表。我正在尝试使用存储过程从表中检索数据并在 UI 中显示结果数据。

由于没有可用的主键,我收到错误 - Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonNullPrimaryKeys。我想将代码从 DBSet 移动到 https://www.learnentityframeworkcore.com/raw-sql 中定义的原始 sql 以下是我现有的代码:

//Data - myDbContext

 public class MyDbContext : DbContext
    {
        public DbSet<LOB> lobs { get; set; }

        public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
        {
        }

        }

// Model  
 public class LOB
    {
        public string Desc { get; set; }
    }

//Index.cshtml.cs

 public class IndexModel : PageModel
    {
        private readonly MyDbContext _dbContext;
        public IndexModel(MyDbContext dbContext)
        {
            _dbContext = dbContext;
        }
        public List<LOB> lOBs { get; set; } = new List<LOB>();

                [BindProperty]
        public string[] SelectedLOBs { get; set; }

        public SelectList LOBOptions { get; set; }


        public async Task OnGetAsync()
        {
            lOBs = await _dbContext.Set<LOB>().FromSql(
                              "EXECUTE sp")
                              .AsNoTracking()
                              .ToListAsync();

            LOBOptions = new SelectList(lOBs, "Desc1");
        }
    }

// Index.cshtml

  <select class="form-control" required multiple id="selLOB" asp-for="SelectedLOBs" asp-items="Model.LOBOptions"></select>

如何使用 context.database 属性填充下拉列表? 谢谢

【问题讨论】:

  • 看起来你需要使用查询类型:learnentityframeworkcore.com/query-types
  • 嗨。我正在使用 ASP.NET 2.0,并且从 2.1 开始使用查询类型
  • 查询类型与您使用的 ASP.NET Core 版本无关。它们属于 Entity Framework Core。
  • 嗨,迈克。在链接中 - 第一条语句说 - 此功能已添加到 EF Core 2.1 中。我正在使用 2.0
  • 要么升级到 2.1,要么您可以回退到使用 ADO.NET 并自己将数据转换为 LOB 实例的集合。您可以在链接到的页面末尾看到如何使用 ADO.NET。

标签: asp.net-core razor-pages


【解决方案1】:

Asp.Net CoreEF Core 是不同的。 Asp.Net Core 2.0对应Microsoft.AspNetCore.All 2.0EF Core 2.1对应Microsoft.EntityFrameworkCore 2.1,可以参考Microsoft.AspNetCore.All 2.0中的Microsoft.EntityFrameworkCore 2.1

请按照以下步骤解决您的问题。

  1. 更新包Microsoft.EntityFrameworkCore到V2.2.3和Microsoft.EntityFrameworkCore.Tools到V2.2.3
  2. DbSet 更改为DbQuery

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
        public DbQuery<LOB> lobs { get; set; }
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            // Customize the ASP.NET Identity model and override the defaults if needed.
            // For example, you can rename the ASP.NET Identity table names and more.
            // Add your customizations after calling base.OnModelCreating(builder);
        }
    }
    
  3. 更改您的剃须刀代码。

    public async Task OnGetAsync()
    {
        lOBs = await _dbContext.Query<LOB>().FromSql(
                          "EXECUTE sp")
                          .AsNoTracking()
                          .ToListAsync();
    
        LOBOptions = new SelectList(lOBs, "Desc", "Desc", "Desc1");
    }
    
  4. 改变你的看法

    <select class="form-control" required multiple id="selLOB" 
        asp-for="SelectedLOBs" asp-items="Model.LOBOptions">
    </select>
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2021-10-13
    • 1970-01-01
    • 2021-11-05
    • 2014-09-26
    • 2017-04-30
    • 2019-08-01
    相关资源
    最近更新 更多