ASP.NET Core:DbSet执行原始存储过程

时间:2019-03-11 06:46:58

标签: asp.net-core razor-pages

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

由于没有可用的主键,因此出现错误-Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonNullPrimaryKeys。我想按照https://www.learnentityframeworkcore.com/raw-sql中的定义将代码从DBSet移到Raw 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属性填充下拉列表? 谢谢

1 个答案:

答案 0 :(得分:0)

Asp.Net CoreEF Core的不同。 Asp.Net Core 2.0对应于Microsoft.AspNetCore.All 2.0,而EF Core 2.1对应于Microsoft.EntityFrameworkCore 2.1,您可以在Microsoft.EntityFrameworkCore 2.1中引用Microsoft.AspNetCore.All 2.0

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

  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>
    
相关问题