Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 仅在集合中级联删除_Entity Framework - Fatal编程技术网

Entity framework 仅在集合中级联删除

Entity framework 仅在集合中级联删除,entity-framework,Entity Framework,如何指示EF不删除一个多个关系,而是级联删除集合 i、 e: 公共类客户端 { 公共int Id{get;set;} 公共字符串名称{get;set;} } 公共阶级秩序 { 公共int Id{get;set;} public int ClientId{get;set;} [外键(“客户ID”)] 公共客户端{get;set;} 公共ICollection OrderItems{get;set;} } 公共类OrderItem { 公共int Id{get;set;} 公共int-OrderId

如何指示EF不删除一个多个关系,而是级联删除集合

i、 e:

公共类客户端
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公共阶级秩序
{
公共int Id{get;set;}
public int ClientId{get;set;}
[外键(“客户ID”)]
公共客户端{get;set;}
公共ICollection OrderItems{get;set;}
}
公共类OrderItem
{
公共int Id{get;set;}
公共int-OrderId{get;set;}
[外键(“订单ID”)]
公共秩序{get;set;}
}
在这个模型中,当我试图删除与某些订单关联的客户机时,我希望避免删除(1)。但是,当我尝试删除带有某些OrderItems的订单时,我希望删除该订单和关联的OrderItems(2)

关于FK列,我还有一个限制:它是[Model]Id格式,而不是EF默认的[Model]\u Id格式

如果我定义

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove();
(1)工作正常,但(2)触发错误


除了对每个集合使用Fluent,还有其他选择吗?你怎么能用流利的语言做到这一点呢?

两种情况都是一对多关系。通过删除级联删除约定,您告诉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");
modelBuilder.Entity()
.HasMany(o=>o.OrderItems)
.WithRequired(i=>i.Order)
.HasForeignKey(i=>i.OrderId)
.WillCascadeOnDelete(真);
modelBuilder.Entity()
.Property(i=>i.OrderId)
.HasColumnName(“订单ID”);
您还可以使用约定(或删除约定),并在需要更改行为时仅对关系使用fluent API

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

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

注意这两个选项都有。

在使用fluent API的情况下,OrderId属性真的是必要的吗?有没有办法将“OrderId”列“映射”到OrderItem.Order nav属性?@Mrnka非常感谢您的帮助。如果可以的话,我将询问如何使用Map()sintax来避免OrderItem中的ItemId属性,因为在这种情况下,我没有Order和OrderItem的交叉关联。现在我不确定您要求的是什么。如果您的意思是两侧都没有导航属性,您仍然可以使用该语法,因为
WithRequired
也可以不带参数使用。您仍然需要导航属性至少有一面来定义关系。
modelBuilder.Entity<Order>()
            .HasMany(o => o.OrderItems)
            .WithRequired(i => i.Order)
            .Map(m => m.MapKey("OrderId"))
            .WillCascadeOnDelete(true);