从第二个表返回下拉字符串

时间:2018-02-17 05:13:49

标签: entity-framework-core razor-pages

我需要为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”列返回到视图。

1 个答案:

答案 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;
}

我希望它可以帮到你。