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を削除しますか?CompanyAds

FileUploadは 3 つの関係すべてのプリンシパルであり、CompanyおよびAdsは従属であるため、これは意味がありません。従属が削除されている場合、プリンシパルをカスケード削除することはできません。1 対多の関係ではFileUploadが他の多くの企業や広告で使用される可能性があるため、ほとんどの場合は失敗します。それらの 1 つをFileUpload削除し、カスケード削除によって削除されると、他の会社や広告の外部キー制約に違反することになります。

あなたのモデルでは、カスケード削除しかできなかったので、a が削除されたときにCompanyとが削除されます (これは私には奇妙に聞こえます)。2 つの関係でからへの複数のカスケード削除パスを構成しているため、それでも Fluent マッピングでは機能しません。SQL Server では、このような関係は許可されていません。少なくとも 1 つの連鎖削除を削除する必要があります。AdsFileUploadFileUploadCompany

あなたのモデルでは、が別の会社や広告で使用されていないかどうかを確認した後、とが削除されFileUploadたときに、レコードを手動で削除する必要があります。CompanyAdsFileUpload

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 に答える