即使配置了删除行为,当与可选关系中的父级断开时,EF Core 依赖项也不会被删除

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

我使用

PropertyAccessMode.Field
模式将我的实体配置为可选的一对多关系,以使事情以
DDD
的方式发生。我正在加载父实体和两个子实体。现在我正在从父级中删除一个子级并保存它。令我惊讶的是,我可以在子表列中看到 EF 设置
NULL
的外键。然后我搜索文档并在本节中发现与加载的依赖项/子项的可选关系需要设置删除行为,以便 EF Core 在严重时删除依赖项,但 EF Core 仍然不会删除子项,而是设置
 NULL
在外键字段中。

image

此问题仅发生在可选关系中。如果我使下面的代码具有所需的关系 EF 将使用相同的代码按预期删除子项。只是我需要根据需要标记关系并在表中进行更改以使外键列为

NOT NULL

image

EF 核心详细信息:

EF核心版本:7.0.3

数据库提供程序:Microsoft.EntityFrameworkCore.SqlServer

目标框架:.NET 6.0

代码示例:

using (var context = new EFDbContext())
{
    var orderItems = new List<OrderItem> { new OrderItem ("one"), new OrderItem ("two") };
    var order = new Order("Test", orderItems);
    context.Orders.Add(order);
    context.SaveChanges();
}

using (var context = new EFDbContext())
{
    var order = context.Orders.Include(x => x.OrderItems).FirstOrDefault();
    order.RemoveOrderItem(order.OrderItems[0]);
    context.Orders.Update(order);
    context.SaveChanges();
}

public class EFDbContext : DbContext
{
    public DbSet<Order> Orders { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Data Source=localhost;Initial Catalog=Test;User Id=sa;Password=xxxx;TrustServerCertificate=true");
        optionsBuilder.LogTo(Console.WriteLine);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Order>(entity =>
        {
            entity.ToTable("Order");
            entity.HasKey(x => x.Id);

            entity.HasMany(order => order.OrderItems)
                   .WithOne()
                   .IsRequired(false)
                   .OnDelete(DeleteBehavior.ClientCascade)
                   .Metadata.PrincipalToDependent.SetPropertyAccessMode(PropertyAccessMode.Field);
        });

        modelBuilder.Entity<OrderItem>(entity =>
        {
            entity.ToTable("OrderItem");
            entity.HasKey(x => x.Id);
        });
    }
}

public class Order
{
    private readonly List<OrderItem> _orderItems = new();

    private Order() { }

    public Order(string name, List<OrderItem> orderItems)
    {
        Name = name;
        _orderItems = orderItems;
    }

    public Guid Id { get; set; }
    public string Name { get; set; }

    public IReadOnlyList<OrderItem> OrderItems => _orderItems.ToList();

    public void RemoveOrderItem(OrderItem orderItem)
    {
        _orderItems.Remove(orderItem);
    }
}

public class OrderItem
{
    private OrderItem() { }

    public Guid Id { get; set; }
    public string Name { get; set; }

    public OrderItem(string name)
    {
        Name = name;
    }
}

如果我遗漏了什么,请帮助我。

c# .net entity-framework entity-framework-core
1个回答
0
投票

我发现 EF Core 团队在 Github 上提出(并回答)了同样的问题。这是因为从 EF Core 7.0 开始,默认情况下不再删除可选关系的孤立依赖项 https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core- 7.0/重大更改?tabs=v7#可选删除

© www.soinside.com 2019 - 2024. All rights reserved.