Relacionamento 1 para 1 com Entity Framework?

Estou tentando criar um relacionamento 1-para-1 com Entity Framework 6. No meu esquema tenho uma classe de Usuario e uma de Plano e o relacionamento seria 1 Usuario tem 1 Plano, porem, esse relacionamento é feito quando o Usuario paga o Plano que então faço o relacionamento.

Usei o HasOptional<Plano>(u => u.plano) para fazer o mapeamento do lado do Usuario, salvo as informações no banco de dados normalmente com o relacionamento, o problema é que quando faço uma busca o Plano não retorna junto com o Usuario e não sei pq isso acontece.

Como resolver isso ?

public class Usuario
{
	public long id  { get; set; }
	public Plano plano { get; set; }

public class Plano 
{
	public int id { get; set; }

//mapeamento
public class UsuarioMap : EntityTypeConfiguration<Usuario>
{
	public UsuarioMap()
	{
		this.ToTable("Usuarios");
		this.HasKey<long>(u => u.id);
		this.HasOptional<Plano>(u => u.plano);

Buscando Dados

//busca o usuario e deveria retornar junto o Plano mas o Plano retorna NULL
Usuario usuarioSession = Session["Usuario"] as Usuario;
            Usuario usuario = context.usuarios.Where(u => u.id == usuarioSession.id).FirstOrDefault();
1 curtida

Como você faz a busca?

Parece que o seu código falta propriedades?

uma lida no nesse tutorial pode te esclarecer e muito.

Editei meu post com a sua pergunta sobre como faço a pesquisa. Lembrando que o Usuario retorna, porem o Plano retorna nulo.

Para esse caso, você tem duas opções:

1º) Utilizando a propriedade Virtual - Lazy Loading
Na classe do Usuario, declare o atributo plano como virtual, assim:
public virtual Plano plano { get; set; }

Assim, quando você recuperar um usuário e for ler(O carregamento dele utilizará Lazy Loading) o atributo “plano”, o mesmo estará preenchido.

Atenção: Para cada Usuário recuperado, serão realizadas duas consultas no banco. Uma para recuperar o usuário e a outra para recuperar o plano(no momento em que o atributo for acessado).

2º) Utilizando o método Include na Consulta - Eager Loading

Ou então, você pode incluir a função Include na consulta, assim:

context.Usuarios.Include(u => u.Plano).ToList();

Assim, o EF irá recuperar o Usuário e suas associações(nesse caso, o plano) em uma unica consulta.

1 curtida