一零到多级联删除

时间:2012-11-10 07:29:58

标签: entity-framework one-to-many entity-framework-5

我有这个型号:

    public class FileUpload
{
    public int FileUploadId { get; set; }
    public string FileName { get; set; }

}

public class Company
{
    public int CompanyId { get; set; }
    public string Name { get; set; }

    public FileUpload Logo { get; set; }
    public int? LogoId { get; set; }

    public FileUpload Catalog { get; set; }
    public int? CatalogId { get; set; }
}

public class Ads
{
    public int AdsId { get; set; }
    public string Name { get; set; }

    public FileUpload Picture { get; set; }
    public int? PictureId { get; set; }
}

public class TestContext : DbContext
{
    public DbSet<Company> Companies { get; set; }
    public DbSet<Ads> Adses { get; set; }
    public DbSet<FileUpload> FileUploads { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<Ads>()
            .HasOptional(a => a.Picture)
            .WithMany()
            .HasForeignKey(a => a.PictureId)
            .WillCascadeOnDelete();

        modelBuilder.Entity<Company>()
           .HasOptional(a => a.Logo)
           .WithMany()
           .HasForeignKey(a => a.LogoId)
           .WillCascadeOnDelete();

        modelBuilder.Entity<Company>()
           .HasOptional(a => a.Catalog)
           .WithMany()
           .HasForeignKey(a => a.CatalogId)
           .WillCascadeOnDelete();
    }
}

此代码在EF迁移中无效!

我想: - 每家公司都有可选的徽标或目录,每个广告都有可选图片。 - 可以直接删除FileUpload记录 - 级联删除

怎么做?!

1 个答案:

答案 0 :(得分:2)

在删除FileUploadCompany时,您是否希望通过级联删除删除Ads

这没有任何意义,因为FileUpload是所有三种关系中的主体,而CompanyAds是受抚养者。删除依赖项时,无法级联删除主体。无论如何,它在大多数情况下都会失败,因为在一对多的关系中,FileUpload可以被许多其他公司或广告使用。如果您删除其中一个并且FileUpload将被级联删除删除,则会违反其他公司和广告的外键约束。

在您的模型中,您只能进行级联删除,以便在删除Company时删除AdsFileUpload(这听起来很奇怪)。即使这样也不适用于您的Fluent映射,因为您已使用这两种关系配置了从FileUploadCompany的多个级联删除路径。 SQL Server不允许此类关系。您必须删除至少一个级联删除。

在您的模型中,您需要在<{1}}和FileUpload被删除之后手动删除Company个记录 之后检查{{1}不被其他公司或广告使用。

如果您在业务逻辑中确定某个公司或广告不能使用给定的Ads,并且公司和广告从未使用相同的FileUpload,它变得越来越简单(删除公司的例子):

FileUpload