1

我有这个模型:

    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 记录可以直接删除 - 级联删除

这该怎么做?!

4

1 回答 1

2

您是否希望在FileUpload删除 a 时通过级联删除来删除 a Companyor Ads

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

在您的模型中,您只能有一个级联删除,以便CompanyAds删除 a 时FileUpload删除(尽管这对我来说听起来很奇怪)。即使这样也不适用于您的 Fluent 映射,因为您已经FileUploadCompany这两个关系配置了多个级联删除路径。SQL Server 不允许此类关系。您必须至少删除一个级联删除。

在您的模型中,您需要FileUpload手动删除记录,Company并且您检查是否未被其他公司或广告使用后Ads删除。FileUpload

如果您在业务逻辑中确定某个给定FileUpload值不能被多个公司或广告使用,并且该给定FileUpload值永远不会被公司和广告使用,那么它会变得更简单(例如删除公司):

using (var context = new TestContext())
{
    var company = context.Companies
        .Include(c => c.Logo)
        .Include(c => c.Catalog)
        .Single(c => c.CompanyId == companyIdToDelete);

    if (company.Logo != null)
        context.FileUploads.Remove(company.Logo);

    if (company.Catalog != null && company.Logo != company.Catalog)
        context.FileUploads.Remove(company.Catalog);

    context.Companies.Remove(company);
}
于 2012-11-10T18:40:49.403 回答