Entity Framework数据注解中与.WillCascadeOnDelete(false);等效的是什么?

16

我目前正在使用启用了迁移但禁用了自动迁移的EF Code First 4.3。

我的问题很简单,是否有数据注释等价于模型配置.WillCascadeOnDelete(false)。

我想装饰我的类,使得外键关系不会触发级联删除。

代码示例:

public class Container
{
    public int ContainerID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Output> Outputs { get; set; }
}

public class Output
{
    public int ContainerID { get; set; }
    public virtual Container Container { get; set; }

    public int OutputTypeID { get; set; }
    public virtual OutputType OutputType { get; set; }

    public int Quantity { get; set; }
}  

public class OutputType 
{
    public int OutputTypeID { get; set; }
    public string Name { get; set; }
}

我想要做这样的事情:

public class Output
{
    [CascadeOnDelete(false)]   
    public int ContainerID { get; set; }
    public virtual Container Container { get; set; }

    [CascadeOnDelete(false)]    
    public int OutputTypeID { get; set; }
    public virtual OutputType OutputType { get; set; }

    public int Quantity { get; set; }
}  
这样我就能正确地搭建迁移。目前,外键关系是级联删除的脚手架。

除了使用模型配置,还有其他想法吗?


有同样的问题。在这里找到了如何启用它的方法(https://dev59.com/Gm035IYBdhLWcg3wMNCW#33276901),但我想只为一个关系禁用它。 - AXMIM
3个回答

19

没有这样的等效物。您必须使用流畅的API有选择地删除级联删除,或者您必须删除 OneToManyCascadeDelete 约定以全局删除它。


如果移除OneToManyCascadeDelete约定,即使您向外键添加注释(如[Required]),约定也会被移除吗? - Jim Wolff
级联删除应仅用于必需关系,移除此约定将导致其破坏。可选关系只需设置为 null。 - Ladislav Mrnka
如果使用OneToManyCascadeDelete = false,我该如何使用数据注释有选择地启用级联删除? - ironic
没有内置的等效项,但是使用EF 6,您可以编写自己的属性和约定(通过反射调用EF的内部成员)。请参见我的答案,它禁用了默认级联并使用属性进行选择。您始终可以通过对约定代码进行一些小的调整来执行相反的操作:https://dev59.com/Gm035IYBdhLWcg3wMNCW#33276901 - Tyson

2
创建一个映射类(使用流畅的语法),并使用以下代码:
// add relationships "Post" and "User" to a "Comment" entity
this.HasRequired(t => t.Post)
    .WithMany(t => t.Comments)
    .HasForeignKey(d => d.PostID)
    .WillCascadeOnDelete(false); // <---

this.HasOptional(t => t.User)
    .WithMany(t => t.Comments)
    .HasForeignKey(d => d.UserID)
    .WillCascadeOnDelete(false); // <---

如果您需要更多信息,这里有一篇关于如何设置流畅映射的好文章


链接已损坏。 - AXMIM

0

只需将外键属性设置为可空即可防止级联删除的发生:

public int? OutputTypeID { get; set; }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接