我需要为Razor Page视图加入两个表。第一个名为“Account”的表包含一个带有int Status的Account记录。名为“AccountStatuses”的第二个表包含帐户的可能状态。 Scaffolding在Account \ Index.cshtml.cs
中创建了以下代码 public IList<Account> Account { get;set; }
public async Task OnGetAsync()
{
Account = await _context.Account.ToListAsync();
}
Account表包含一列“Status”,对应于AccountStatus表中的“Value”列。我想加入这些并将AccountStatus表中的“StatusString”列返回到视图。
答案 0 :(得分:0)
您不必加入这两个表来获取值。如果您正确设置模型,您可以让实体框架为您完成工作。我将举例说明如何创建模型。首先,我们有两个模型:
public class Account
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int AccountID { get; set; }
public string AccountName { get; set; }
public int AccountStatusID { get; set; }
[ForeignKey("AccountStatusID")]
public virtual AccountStatus AccountStatus { get; set; }
}
public class AccountStatus
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int AccountStatusID { get; set; }
public string AccountStatusName { get; set; }
public virtual ICollection<Account> Accounts { get; set; }
}
Account模型具有AccountStatusID属性,该属性将包含状态的id。我们还为AccountStatus模型定义了一个虚拟属性。当我们从实体框架中询问时,EntityFramework会自动加载它。
我们为AccountStatus模型做了类似的事情,但在这个模型中,我们将有一个虚拟的Account模型集合。
现在我们必须定义ApplicationDbContext类,它可以是以下内容:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
public DbSet<Account> Accounts { get; set; }
public DbSet<AccountStatus> AccountStatuses { get; set; }
}
现在我们可以执行以下查询:
// Get the account by id
Account account1 = await _context.Accounts.SingleOrDefaultAsync(m => m.AccountID == id);
// Get the account by id including the Account status
Account account2 = await _context.Accounts.Include(m => m.AccountStatus).SingleOrDefaultAsync(m => m.AccountID == id);
// account2.AccountStatus contains the AccountStatus
string AccountStatusName = account2.AccountStatus.AccountStatusName;
// Get teh account status by id
AccountStatus AccountStatus1 = await _context.AccountStatuses.SingleOrDefaultAsync(m => m.AccountStatusID == id);
// Get the account status by id include the accounts
AccountStatus AccountStatus2 = await _context.AccountStatuses.Include(m => m.Accounts).SingleOrDefaultAsync(m => m.AccountStatusID == id);
// AccountStatus2.Accounts contain all the accounts which has be set to be equal to the current account status
foreach (var account in AccountStatus2.Accounts)
{
string AccountName = account.AccountName;
}
我希望它可以帮到你。