我有这个型号:
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 :(得分:2)
在删除FileUpload
或Company
时,您是否希望通过级联删除删除Ads
?
这没有任何意义,因为FileUpload
是所有三种关系中的主体,而Company
和Ads
是受抚养者。删除依赖项时,无法级联删除主体。无论如何,它在大多数情况下都会失败,因为在一对多的关系中,FileUpload
可以被许多其他公司或广告使用。如果您删除其中一个并且FileUpload
将被级联删除删除,则会违反其他公司和广告的外键约束。
在您的模型中,您只能进行级联删除,以便在删除Company
时删除Ads
和FileUpload
(这听起来很奇怪)。即使这样也不适用于您的Fluent映射,因为您已使用这两种关系配置了从FileUpload
到Company
的多个级联删除路径。 SQL Server不允许此类关系。您必须删除至少一个级联删除。
在您的模型中,您需要在<{1}}和FileUpload
被删除之后手动删除Company
个记录 之后检查{{1}不被其他公司或广告使用。
如果您在业务逻辑中确定某个公司或广告不能使用给定的Ads
,并且公司和广告从未使用相同的FileUpload
,它变得越来越简单(删除公司的例子):
FileUpload