一对一关系不能同时包含两个类

时间:2019-04-20 11:37:41

标签: c# entity-framework entity-framework-core

我正在使用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(); 
}

请注意,该类别为nu​​ll,如何以已经加载该类别的方式完成?

1 个答案:

答案 0 :(得分:1)

  

类别可能有多个产品。

然后不是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>()配置。而且,您也不需要分别为ProdutoCategoria使用两个不同的DbContext。而是按照以下步骤制作您的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(); 
}