如何使用 Entity Framework Core 删除没有外键的相关数据

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

我希望在我的数据库上下文类中使用它:

 OnDelete(DeleteBehavior.Cascade)

但它位于没有外键的 SQL Server 表上。

我的父表

TransplantList
有一个列
heartId
,它对应于表
HeartList
,在 SQL Server 中如下所示:

 heartId
 heartName
 heartLocation
 heartType

TransplantList
每行只能有一个
heartId

当我删除

TransplantList
中的一行时,我还想删除(如果它不为 NULL)与其关联的
heartId

我尝试将其添加到我的上下文数据库中:

 Entity.OnDelete(DeleteBehavior.Cascade);

但这只会给我一个错误。

有办法做到这一点吗?

谢谢!

sql-server-2012 entity-framework-core dbcontext
2个回答
2
投票

如果父子表没有任何关系和外键,Entity Framework core 无法为您级联删除子数据。因此,在删除子数据和父数据之前,您必须手动获取子数据。

var heart = context.Hearts.Where(x => x.HeartId == transparent.HeartId).FirstOrDefault();

if (heart != null)
    context.Hearts.Remove(heart);

context.Transparents.Remove(transparent);
context.SaveChanges();

2
投票

Cascade
操作不是实体框架的一部分。它仅定义它。该操作本身由数据库服务器根据外键关系单独执行。如果您的数据库没有定义该关系,则实体框架无能为力。

至于-

如何使用实体框架删除没有外键的相关数据 核心

检查是否存在相关实体。如果有,请删除它 -

var transplant = await context.Transplants.FindAsync(id);
if(transplant != null)
{
    // check if heartId column on Transplant has a non-null value
    if(transplant.HeartId != null)
    {
        // query the Heart entity with heartId
        Heart heart = await context.Hearts.FirstOrDefaultAsync(p => p.HeartId == transplant.HeartId);

        // if a Heart entity is found, Delete it
        if(heart != null)
            context.Hearts.Remove(heart);
    }

    context.Transplants.Remove(transplant); 

    await context.SaveChangesAsync();
}
© www.soinside.com 2019 - 2024. All rights reserved.