Select two attributes from two different tables in a view

1

I have the model (superclass) Pessoa and the model Aluno

public partial class Pessoa
{
    public Pessoa()
    {
        this.Escola = new HashSet<Escola>();
    }
    [Key]
    public int PessoaID { get; set; }           
    public String Nome { get; set; }
    public String Morada { get; set; }          
    public virtual ICollection<Escola> Escola { get; set; }
}

public partial class Aluno
{
    public Aluno()

    [Key, ForeignKey("Pessoa")]
    public int AlunoID { get; set; }    
    public String NomeEscola { get; set; }
    public String AnoEscolar { get; set; }
    public String TurmaEscolar { get; set; }    
    public virtual Pessoa Pessoa { get; set; }
}

I want to make a selectlist of the Name attribute in a view where StudentID is equal to PersonID I tried with the following code in the Student controller but without success

public ActionResult Edit(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Aluno aluno = db.aluno.Find(id);
    if (aluno == null)
    {
        return HttpNotFound();
    }
    ViewBag.AlunoID = new SelectList(db.Pessoa, "PessoaID", "Nome", aluno.AlunoID);
    return View(aluno);
}
    
asked by anonymous 24.08.2015 / 17:25

1 answer

1

Your modeling is incorrect. A Aluno is a Pessoa , so Aluno must be a derivation of Pessoa :

public partial class Pessoa
{
    // Isto está incorreto, então comentei. 
    // Quem inicializa propriedades de navegação é o Entity Framework.
    /* public Pessoa()
    {
        this.Escola = new HashSet<Escola>();
    } */

    [Key]
    public int PessoaID { get; set; }           
    public String Nome { get; set; }
    public String Morada { get; set; }          
    public virtual ICollection<Escola> Escola { get; set; }
}

public partial class Aluno : Pessoa
{
    // Este construtor está sem utilidade, então também retirei.
    // public Aluno()
    public String NomeEscola { get; set; }
    public String AnoEscolar { get; set; }
    public String TurmaEscolar { get; set; }    

    // Esta propriedade de navegação não é necessária.
    // public virtual Pessoa Pessoa { get; set; }
}

In the context, it is interesting to have both DbSet , both Pessoa and Aluno , mapped:

    public DbSet<Aluno> Alunos { get; set; }
    public DbSet<Pessoa> Pessoas { get; set; }

If you want to select any type of person, use contexto.Pessoas . If you want to specifically select students, use contexto.Alunos .

Your Controller will look like this:

public ActionResult Edit(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Aluno aluno = db.aluno.Find(id);
    if (aluno == null)
    {
        return HttpNotFound();
    }
    ViewBag.AlunoID = new SelectList(db.Alunos, "PessoaID", "Nome", aluno.AlunoID);
    return View(aluno);
}
    
24.08.2015 / 18:08