我正在使用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属性填充下拉列表? 谢谢
答案 0 :(得分:0)
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
。
请按照以下步骤解决您的问题。
Microsoft.EntityFrameworkCore
更新到V2.2.3,并将Microsoft.EntityFrameworkCore.Tools
更新到V2.2.3 将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);
}
}
更改您的剃刀代码。
public async Task OnGetAsync()
{
lOBs = await _dbContext.Query<LOB>().FromSql(
"EXECUTE sp")
.AsNoTracking()
.ToListAsync();
LOBOptions = new SelectList(lOBs, "Desc", "Desc", "Desc1");
}
更改视图
<select class="form-control" required multiple id="selLOB"
asp-for="SelectedLOBs" asp-items="Model.LOBOptions">
</select>