0

如何指示 EF 不要删除 OneToMany 关系而是级联删除集合?

IE:

public class Client
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public int ClientId { get; set; }
    [ForeignKey("ClientId")]
    public Client Client { get; set; }
    public ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }
    [ForeignKey("OrderId")]
    public Order Order { get; set; }
}

在此模型中,当我尝试删除与某些订单关联的客户时,我希望避免删除 (1)。但是,当我尝试删除带有一些 OrderItems 的订单时,我想删除该订单和相关的 OrderItems (2)。

我对 FK 列也有一个限制:它采用 [Model]Id 格式,而不是 EF 默认的 [Model]_Id 格式。

如果我定义

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

(1) 工作正常,但 (2) 触发错误。

除了为每个集合使用 Fluent 之外,还有其他选择吗?无论如何,如何在 Fluent 中做到这一点?

4

1 回答 1

2

你这两种情况都是一对多的关系。通过删除级联删除约定,您告诉 EF 这两种情况都应该在没有级联删除的情况下处理。

如果要控制每个关系的级联删除,则需要使用 fluent API:

modelBuilder.Entity<Order>()
            .HasMany(o => o.OrderItems)
            .WithRequired(i => i.Order)
            .HasForeignKey(i => i.OrderId)
            .WillCascadeOnDelete(true);

modelBuilder.Entity<OrderItem>()
            .Property(i => i.OrderId)
            .HasColumnName("OrderId");

当您想更改行为时,您还可以使用约定(或删除它)并仅将流式 API 用于关系。

如果您不想拥有 OrderId 属性,您可以使用:

modelBuilder.Entity<Order>()
            .HasMany(o => o.OrderItems)
            .WithRequired(i => i.Order)
            .Map(m => m.MapKey("OrderId"))
            .WillCascadeOnDelete(true);

请注意,这两个选项在 EF 中具有不同的实现

于 2013-04-16T18:28:03.467 回答