我有一个旧的桌面系统,我正在使用 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。
虽然两个 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。