两个fk同桌

问题描述 投票:0回答:1

我有一个旧的桌面系统,我正在使用 EF Core 使用 C# 重构后端。

在旧数据库中,有一个表来定义补品。我有两列,并且使用相同的源表。

主表:

Product

Id
Name
etc...

第二张桌子:

Complements

Id - (Original product) FK -\> Product.Id
Id2 - (Complement product) FK -\> Product.Id

我可以使用 EF Core 构建它吗?

我的产品代码:

using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Phoenix.Models.Products
{
    [Table("products")]
    [Comment("Cadastro de produtos")]
    [Index(nameof(Name), Name = "idx_prd_name", IsUnique = true)]
    public class Product
    {
        [Key]
        [Column("prd_id")]
        [Comment("Identificador unico")]
        [Display(Name = "Código")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required(ErrorMessage = "O campo {0} é obrigatório.")]
        [Column("prd_name")]
        [Comment("Nome do produto")]
        [Display(Name = "Nome do produto")]
        [MinLength(3, ErrorMessage = "É necessário pelo menos {1} caracteres!")]
        [MaxLength(100, ErrorMessage = "O campo {0} suporta apenas {1} caracteres!")]
        public string? Name { get; set; }
    }
}

我的

Complement
代码:

using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Phoenix.Models.Products
{
    [Table("complements")]
    [Comment("Cadastro de produtos complementares")]
    public class Complement
    {
        [Key]
        [Column("pcp_id")]
        [Comment("Identificador unico")]
        [Display(Name = "Código")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required(ErrorMessage = "O campo {0} é obrigatório.")]
        [Column("prc_id")]
        [Comment("Identificador do produto complementar")]
        [Display(Name = "Produto complementar")]
        [ForeignKey("Product")]
        public int ProductId { get; set; }
    
        [Display(Name = "Produto complementar")]
        public virtual Product? Product { get; set; }
    
        [Required(ErrorMessage = "O campo {0} é obrigatório.")]
        [Column("prd_id")]
        [Comment("Identificador do produto principal")]
        [Display(Name = "Produto")]
        [ForeignKey("Product")]
        public int OriginalId { get; set; }
    }
}

当我尝试控制器时,VS 生成错误消息:

我打算创建一个新表,其中同一个表有两个 FK。

c# database entity-framework entity-framework-core foreign-keys
1个回答
0
投票

虽然两个 FK 都指向产品表,但它们并不总是引用相同的产品行,因此如果您本质上有一个原始产品 ID 和一个补充产品 ID,我会考虑构建补充产品,如下所示:

[Table("complements")]
[Comment("Cadastro de produtos complementares")]
public class Complement
{
    [Key]
    [Column("pcp_id")]
    [Comment("Identificador unico")]
    [Display(Name = "Código")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required(ErrorMessage = "O campo {0} é obrigatório.")]
    [Column("prc_id")]
    [Comment("Identificador do produto complementar")]
    [Display(Name = "Produto complementar")]
    [ForeignKey("Product")]
    public int ProductId { get; set; }

    [Display(Name = "Produto complementar")]
    public virtual Product? Product { get; set; }

    [Required(ErrorMessage = "O campo {0} é obrigatório.")]
    [Column("prd_id")]
    [Comment("Identificador do produto principal")]
    [Display(Name = "Produto")]
    [ForeignKey("OriginalProduct")]
    public int OriginalId { get; set; }

    public virtual Product? OriginalProduct { get; set; }

}

ProductId 是“Product”导航属性的 FK,而 OriginalId 是“OriginalProduct”导航属性的 FK。

© www.soinside.com 2019 - 2024. All rights reserved.