2012-11-10 107 views
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記錄可以直接刪除 - 級聯刪除

如何做到這一點?

+0

解釋一下你的_not working_ – Eranga

回答

2

您是否希望在刪除CompanyAds時通過級聯刪除刪除FileUpload

這樣做沒有意義,因爲FileUpload是所有三種關係中的主體,CompanyAds是受撫養人。刪除依賴關係時,不能級聯刪除主體。無論如何,這在大多數情況下都會失敗,因爲在一對多關係中,FileUpload可能會被許多其他公司或廣告所使用。如果您刪除其中一個,並且FileUpload將被級聯刪除刪除,則您將違反其他公司和廣告的外鍵約束。

在你的模型中,你只能有一個級聯刪除,所以CompanyAds被刪除時FileUpload被刪除(儘管我聽起來很奇怪)。即使這樣也不適用於你的Fluent映射,因爲你已經配置了從FileUploadCompany兩個關係的多個級聯刪除路徑。 SQL Server不允許這種關係。您將不得不刪除至少一個級聯刪除。

在你的模型,你需要手動刪除記錄FileUploadCompanyAds被刪除如果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); 
} 
+0

意味着感謝名單了很多東西......我這樣做在我的項目,但thanx您不錯的解釋:) ...我得到它;) –