如何指示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中做到这一点?
答案 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。