我使用
PropertyAccessMode.Field
模式将我的实体配置为可选的一对多关系,以使事情以 DDD
的方式发生。我正在加载父实体和两个子实体。现在我正在从父级中删除一个子级并保存它。令我惊讶的是,我可以在子表列中看到 EF 设置 NULL
的外键。然后我搜索文档并在本节中发现与加载的依赖项/子项的可选关系需要设置删除行为,以便 EF Core 在严重时删除依赖项,但 EF Core 仍然不会删除子项,而是设置 NULL
在外键字段中。
此问题仅发生在可选关系中。如果我使下面的代码具有所需的关系 EF 将使用相同的代码按预期删除子项。只是我需要根据需要标记关系并在表中进行更改以使外键列为
NOT NULL
。
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;
}
}
如果我遗漏了什么,请帮助我。
我发现 EF Core 团队在 Github 上提出(并回答)了同样的问题。这是因为从 EF Core 7.0 开始,默认情况下不再删除可选关系的孤立依赖项 https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core- 7.0/重大更改?tabs=v7#可选删除