ASP.NET Core: DbSet для выполнения необработанной хранимой процедуры - PullRequest
0 голосов
/ 11 марта 2019

Я использую ASP.NET Core 2.0 и бритвенные страницы.Таблица SQL не имеет первичного ключа, и я не смогу вносить изменения в таблицу SQL.Я пытаюсь использовать хранимую процедуру для извлечения данных из таблицы и отображения результирующих данных в пользовательском интерфейсе.

Поскольку первичный ключ недоступен, я получаю сообщение об ошибке как - Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonNullPrimaryKeys.Я хотел бы переместить код из DBSet в Raw sql, как определено в https://www.learnentityframeworkcore.com/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 голосов
/ 12 марта 2019

Для Asp.Net Core и EF 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>
    
...