EF CascadeOnDelete Code First

时间:2013-09-06 17:06:04

标签: c# entity-framework

我有这个实体:

public class Account
{
    [Key]
    [ForeignKey("Company")]
    [Required]
    public Guid CompanyId { get; set; }

    public virtual Company Company { get; set; }
}

这一个:

public class Company : PrimaryKey
{
    public string Name { get; set; }

    public virtual ICollection<Contact> Contacts { get; set; }
    public virtual Account Account { get; set; }
}

如何使用流畅的api启用级联删除,我试过这个:

modelBuilder.Entity<Company>().HasOptional<Account>().WithRequired().WillCascadeOnDelete();

但我不知道这意味着什么。基本上,我希望Company有一个可选的Account,在删除公司时会删除它。

2 个答案:

答案 0 :(得分:2)

您需要的映射是:

modelBuilder.Entity<Company>()
    .HasOptional(c => c.Account)
    .WithRequired(a => a.Company)
    .WillCascadeOnDelete();

这是CompanyAccount之间的一对一关系。通过此映射,您可以删除[ForeignKey("Company")]属性和[Required]属性,因为Guid不可为空,因此始终需要。

答案 1 :(得分:0)

请点击链接Enabling Cascade Delete

  

您可以使用以下命令在关系上配置级联删除   WillCascadeOnDelete方法。如果是依赖实体的外键   不可为空,然后Code First设置级联删除   关系。如果依赖实体上的外键可以为空,   Code First不会在关系上设置级联删除,以及何时   删除主体后,外键将被设置为null。

     

您可以使用以下命令删除这些级联删除约定:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>()
  

以下代码将配置所需的关系   禁用级联删除。

modelBuilder.Entity<Course>()
    .HasRequired(t => t.Department)
    .WithMany(t => t.Courses)
    .HasForeignKey(d => d.DepartmentID)
    .WillCascadeOnDelete(false);
在你的例子中有类似的东西:

modelBuilder
  .Entity<Company>()
  .HasOptional<Account>()
  .HasForeignKey(a => a.CompanyId)
  .WillCascadeOnDelete();