仅在集合中删除级联

时间:2013-04-16 17:51:43

标签: entity-framework

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

即:

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的Order时,我想删除Order和关联的OrderItems(2)。

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

如果我定义

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

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

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

1 个答案:

答案 0 :(得分:2)

你们两个案件都是一对多的关系。通过删除级联删除约定,您告诉EF应该处理这两种情况而不进行级联删除。

如果要控制每个关系的级联删除,则需要使用流畅的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);

请注意,这两个选项都有different implementation in EF