Entity Framework Core v7+:在没有导航属性的情况下对外键相关表执行删除

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

我有以下两个表,每个表都有数百万条记录,因此需要删除性能

Table Product
(
    DateOf date not null, 
    Type varchar(100) not null,
    ProductId int not null,
    ProductCategory varchar(100) not null
    Primary Key (DateOf,Type)
)

Table ProductListing
(
    DateOf date not null, 
    Type varchar(100) not null,
    RowId int identity(1,1) not null,
    Quantity int not null,
    Primary key(DateOf,Type,RowId)
    Foreign key (DateOf,Type) references Product (DateOf,Type)
)

通常删除记录是通过 DateOf 和 ProductCategory 发生的(注意该字段不是主键的一部分)

我有代码 EF 代码,例如假设用户传递日期和类别参数

dbContext.Product.Where(p=> p.DateOf = date && p.ProductCategory = category).ExecuteDelete()

这正确地从 Product 表中删除了相应的记录,但我们需要太高效地从 ProductListing 表中删除记录。理想的删除语句是

Delete pl from 
ProductListing pl
inner join Product p on p.DateOf=pl.DateOf and p.Type=pl.Type -- join on foreign key
where
-- below are the parameters passed by user
p.DateOf = date
and p.ProductCategory = category

所以我想使用实体框架生成上述删除语句,并在从产品表中删除之前执行它,并在事务中执行产品删除,如上所示。

我不确定如何强制实体框架核心生成这样的删除语句。请注意,由于记录数量巨大,因此需要上述删除语句,并且该单个语句在一个语句中负责删除

请注意,由于遗留数据原因,无法添加表级联删除。

c# entity-framework-core foreign-keys sql-server-2016 delete-row
1个回答
0
投票

假设您在

Product
类中有
ProductListing
导航属性,您可以编写以下查询:

using var transaction = dbContext.Database.BeginTransaction();

dbContext.ProductListing
    .Where(pl => pl.Product.DateOf = date && pl.Product.ProductCategory = category)
    .ExecuteDelete();

dbContext.Product
    .Where(p => p.DateOf = date && p.ProductCategory = category)
    .ExecuteDelete();

transaction.Commit();
© www.soinside.com 2019 - 2024. All rights reserved.