#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. Спасибо, я использовал второй метод. Теперь он работает.