Удаление записи из М-М таблицы EF Core
Есть две сущности: Product, Category. Они связанные друг с другом как многие-к-многим по линковоной таблице ProductCategory. У данной, промежуточной таблицы есть два поля ProductID, CategoryID.
Изначально у ProductCategory были эти два поля ProductID и CategoryID как внешние и праймари ключи. НО! Была проблема, что при удалении из этой таблице либо ID продукта, или же категории - удаление происходило каскадно(удалялся везде этот итем). Тогда было решено изменить OnDeleteBehavior с Cascade на SetNull.
И для того что бы SetNull "проработал", я в миграции удалил что ProductID, CategoryID это первичные ключи и так же указал, что внешние ключи могут быть null.
И теперь таблица выглядит таким образов, что есть только два атрибута, которые выступают как внешние ключи на первичные ключи соответствующей таблицы, и кортежи не имеют никаких "уникальностей"(имею ввиду pk).
Проблема заключается, что при удалении из таблицы кортежа какого-то внешенего ключа, вместо него становится null. А если в самом кортеже удалить и категорию, и продукт - получится что в записи таблицы будет null - null => бесполезная запись.
Как можно решить данную проблему?
migrationBuilder.CreateTable(
name: "ProductCategories",
columns: table => new
{
ProductId = table.Column<int>(type: "int", nullable: true),
CategoryId = table.Column<int>(type: "int", nullable: true)
},
constraints: table =>
{
table.ForeignKey(
name: "FK_ProductCategories_Categories_CategoryId",
column: x => x.CategoryId,
principalTable: "Categories",
principalColumn: "Id",
onDelete: ReferentialAction.SetNull);
table.ForeignKey(
name: "FK_ProductCategories_Products_ProductId",
column: x => x.ProductId,
principalTable: "Products",
principalColumn: "Id",
onDelete: ReferentialAction.SetNull);
});
migrationBuilder.CreateTable(
name: "Categories",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Label = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false),
Thumbnail = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Categories", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Products",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Label = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
Price = table.Column<decimal>(type: "decimal(18,2)", precision: 18, scale: 2, nullable: false),
Description = table.Column<string>(type: "nvarchar(30)", maxLength: 30, nullable: false),
Thumbnail = table.Column<string>(type: "nvarchar(250)", maxLength: 250, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Products", x => x.Id);
});