Проблема с внешними ключами и столбцами в Entity Framework

#c# #entity-framework-core

#c# #entity-framework-core

Вопрос:

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

Вот классы, которые я использую для создания таблиц.

 public class Productos
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int IdProducto { get; set; }

    [Required]
    [MaxLength(100)]
    public string NombreProducto { get; set; }

    [Required]
    [Column(TypeName = "nvarchar(MAX)")]
    public string DescripcionProducto { get; set; }

    [MaxLength(50)]
    public string Tallas { get; set; }

    [MaxLength(100)]
    public string Colores { get; set; }

    [Required]
    [Column(TypeName = "nvarchar(MAX)")]
    public string ImagenURL { get; set; }

    [Required]
    public int Precio { get; set; }

    [Required]
    public int Inventario { get; set; }

    public int IdCategoria { get; set; }
    public virtual Categorias Categorias { get; set; }

    public virtual ICollection<DetallesCarritos> DetallesCarritos { get; set; }

    public virtual ICollection<DetallesListasDeseos> DetallesListasDeseos { get; set; }
}
  

Из приведенного выше кода свойство, которое я хочу использовать с внешним ключом IdCategoria , — это значение, полученное из этого другого класса:

 public class Categorias
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int IdCategoria { get; set; }
              
    [Required]
    [MaxLength(50)]
    public string NombreCategoria { get; set; }

    [Required]
    [Column(TypeName = "nvarchar(MAX)")]
    public string DescripcionCategoria { get; set; }

    public virtual ICollection<Productos> Productos { get; set; }
}
  

А теперь фрагмент информации о миграции EF:

 migrationBuilder.CreateTable(
            name: "Productos",
            columns: table => new
            {
                IdProducto = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                NombreProducto = table.Column<string>(maxLength: 100, nullable: false),
                DescripcionProducto = table.Column<string>(type: "nvarchar(MAX)", nullable: false),
                Tallas = table.Column<string>(maxLength: 50, nullable: true),
                Colores = table.Column<string>(maxLength: 100, nullable: true),
                ImagenURL = table.Column<string>(type: "nvarchar(MAX)", nullable: false),
                Precio = table.Column<int>(nullable: false),
                Inventario = table.Column<int>(nullable: false),
                IdCategoria = table.Column<int>(nullable: false),
                CategoriasIdCategoria = table.Column<int>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Productos", x => x.IdProducto);
                table.ForeignKey(
                    name: "FK_Productos_Categorias_CategoriasIdCategoria",
                    column: x => x.CategoriasIdCategoria,
                    principalTable: "Categorias",
                    principalColumn: "IdCategoria",
                    onDelete: ReferentialAction.Restrict);
            });
  

Из приведенного выше кода для Productos таблицы EF создаст столбец IdCategoria как обычный столбец, но я хочу, чтобы он был с внешним ключом. А дополнительный столбец CategoriasIdCategoria — это фактический столбец, который EF создает с помощью внешнего ключа.

Я попробовал это:

     [ForeignKey("IdCategoria")]
    public int IdCategoria { get; set; }
    public virtual Categorias Categorias { get; set; }
  

Но я получаю тот же результат.

Я использую EF Core, и я новичок в этом, поэтому любая помощь приветствуется. И извините за мой английский.

Комментарии:

1. Вам нужно поместить [ForeignKey("Categorias")] вместо этого. Не могли бы вы проверить, работает ли это? Пожалуйста, проверьте это для получения более подробной информации.

Ответ №1:

Вы размещаете аннотацию данных в неправильном положении, исправьте свой код, как показано ниже:

 public int IdCategoria { get; set; }

[ForeignKey("IdCategoria")]
public virtual Categorias Categorias { get; set; }
  

или вы можете использовать имя таблицы для введения внешнего ключа:

 [ForeignKey("Categorias")]
public int IdCategoria { get; set; }

public virtual Categorias Categorias { get; set; }
  

чтобы углубиться, вы можете перейти по этой ссылке.
удачи.

Комментарии:

1. Спасибо, я использовал второй метод. Теперь он работает.