一对一的关系不会同时进行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一对一的关系不会同时进行相关的知识,希望对你有一定的参考价值。

我正在使用实体框架来持久化并检索一些信息,我有一对一的关系。产品和类别,其中产品具有类别和类别可能有多个产品。

我有以下结构

我创建了两个实体并建立了关系,但是当我检索这些信息时,它会向我提供产品的信息,但是类别为nu​​ll

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

分类Contextos.ca

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,如何以已加载类别的方式完成?

答案

类别可能有几种产品。

然后它不是qazxsw poi,而是它的qazxsw poi和你的模型类应该如下:

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; } } 配置。而且你也不需要为FluentAPImodelBuilder.Entity<Produto>()分别使用两个不同的DbContext。而是使你的Produto如下:

Categoria

您的查询应如下所示:

DbContext

以上是关于一对一的关系不会同时进行的主要内容,如果未能解决你的问题,请参考以下文章

原则 3:一对一的单向关系不会返回所有字段

11-表之间关系

在 SQL Server 中定义一对一关系

在没有主键但在多个重叠字段上加载模型一对多关系的雄辩方式

通过代码进行 Nhibernate 一对一映射

存在不会在持久存储中更新的一对多关系的问题