Отношения один к одному не несут оба класса - PullRequest
0 голосов
/ 20 апреля 2019

Я использую Entity Framework для сохранения и получения некоторой информации, у меня отношения один-к-одному. Продукт и категория, где у продукта есть категория, а у категории может быть несколько продуктов.

У меня есть следующая структура

Я создал две сущности и установил отношения, но когда я получаю эту информацию, она приносит мне информацию о продуктах, однако категория становится нулевой

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

Когда я запускаю функцию для получения информации, возвращается следующий json

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

Мой запрос:

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

Обратите внимание, что категория является нулевой, как это можно сделать таким образом, чтобы категория уже была загружена?

1 Ответ

1 голос
/ 20 апреля 2019

Категория может иметь несколько продуктов.

Тогда это не one-to-one, а one-to-many и классы вашей модели должны быть следующими:

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

И вам не нужна никакая FluentAPI конфигурация.Поэтому удалите конфигурацию modelBuilder.Entity<Produto>().И вам также не нужны два разных DbContext для Produto и Categoria отдельно.Вместо этого сделайте ваш DbContext следующим образом:

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

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

И ваш запрос должен быть следующим:

[HttpGet] 
public async Task<ActionResult<IEnumerable<Produto>>> GetProdutos() 
{ 
   return await _context.Produtos.Include(p => p.categoria).ToListAsync(); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...