简体   繁体   中英

One-to-one relationship does not carry both classes

I'm using the Entity Framework to persist and retrieve some information, I have a one-to-one relationship. Product and Category, where a Product has a Category and a Category may have several Products.

I have the following structure

I created the two entities and made the relationship, but when I retrieve this information it brings me the information of the products however the category comes as null

Produto.cs

public class Produto 
{
    [Key]
    public int id { get; set; }
    public string descricao { get; set; }
    public string observacao { get; set; }
    public int status { get; set; }
    public decimal valorVenda { get; set; }
    public virtual Categoria categoria { get; set; }
}

Categoria.cs

public class Categoria 
{
    [Key]
    [ForeignKey("categoriaid")]
    public int id { get; set; }
    public string descricao { get; set; }
    public string observacao { get; set; }
    public int status { get; set; }
    public virtual Produto produto { get; set; }
}

ProdutoContexto.cs

public class ProdutoContexto : DbContext 
{
    public ProdutoContexto(DbContextOptions<ProdutoContexto> options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Produto>()
            .HasOne(a => a.categoria)
            .WithOne(b => b.produto)
            .HasForeignKey<Categoria>(b => b.id);
    }

    public DbSet<Produto> Produtos { get; set; }
}

CategoriaContexto.cs

public class CategoriaContexto : DbContext 
{
    public CategoriaContexto(DbContextOptions<CategoriaContexto> options) : base(options)
    {
    }
    public DbSet<Categoria> Categorias { get; set; }
}

When I run the function to retrieve the information the following json is returned

[{"id":1,"descricao":"Coca-Cola","observacao":"Coca-Cola Gelada","status":1,"valorVenda":5.50,"categoria":null}]

My Query is:

[HttpGet] 
public async Task<ActionResult<IEnumerable<Produto>>> GetProdutos() 
{ 
   return await _context.Produtos.ToListAsync(); 
}

Note that the category is null, how can it be done in such a way that the category is already loaded?

Category may have several Products.

Then its not one-to-one , instead its one-to-many and your model classes should be as follows:

public class Categoria 
{
    [Key]
    public int id { get; set; }
    public string descricao { get; set; }
    public string observacao { get; set; }
    public int status { get; set; }

    public virtual ICollection<Produto> produtos { get; set; }
}

public class Produto 
{
    [Key]
    public int id { get; set; }

    [ForeignKey("categoria")]
    public int categoriaId {get; set;}

    public string descricao { get; set; }
    public string observacao { get; set; }
    public int status { get; set; }
    public decimal valorVenda { get; set; }

    public virtual Categoria categoria { get; set; }
}

And you don't need any FluentAPI configuration. So remove the modelBuilder.Entity<Produto>() configuration. And you also don't need two different DbContext for Produto and Categoria separately. Instead make your DbContext as follows:

public class ApplicationDbContexto : DbContext 
{
    public ApplicationDbContexto(DbContextOptions<ApplicationDbContexto> options) : base(options)
    {
    }

    public DbSet<Categoria> Categorias { get; set; }
    public DbSet<Produto> Produtos { get; set; }
}

And your query should be as follows:

[HttpGet] 
public async Task<ActionResult<IEnumerable<Produto>>> GetProdutos() 
{ 
   return await _context.Produtos.Include(p => p.categoria).ToListAsync(); 
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM