我有2个实体,
我想使用代码优先的流畅API进行配置,以便每条新闻可以包含0,1或多于1个附件。
这是我现在正在使用的
public NewsMap()
{
this.ToTable("News"); // Table Name
this.HasKey(m => m.Id); // Primary Key
// Field Definition
this.Property(m => m.Title).HasMaxLength(255).IsRequired();
this.Property(m => m.Body).HasColumnType("Text").IsRequired();
this.Property(m => m.Summary).HasMaxLength(1000).IsRequired();
this.Property(m => m.AuthorId).IsRequired();
this.Property(m => m.CreatedOn).IsRequired();
this.Property(m => m.UpdatedOn).IsRequired();
this.HasMany(m => m.Attachments).WithMany().Map(m => m.MapLeftKey("NewsId").MapRightKey("AttachmentId"));
}
public class FileAttachmentMap : EntityTypeConfiguration<FileAttachment>
{
public FileAttachmentMap()
{
this.ToTable("FileAttachments"); // Table Name
this.HasKey(m => m.Id); // Primary Key
// Field Definition
this.Property(m => m.DisplayName).HasMaxLength(256).IsRequired();
this.Property(m => m.PhysicalFileName).HasMaxLength(256).IsRequired();
this.Property(m => m.Extension).HasMaxLength(50).IsRequired();
this.Property(m => m.IsImage).IsRequired();
this.Property(m => m.ThumbTiny).HasMaxLength(275).IsOptional();
this.Property(m => m.ThumbSmall).HasMaxLength(275).IsOptional();
this.Property(m => m.ThumbMid).HasMaxLength(275).IsOptional();
this.Property(m => m.ByteSize).IsRequired();
this.Property(m => m.StorageType).IsRequired();
this.Property(m => m.CreatedOn).IsRequired();
this.Property(m => m.UpdatedOn).IsRequired();
}
}
此映射正确生成一个名为NewsFileAttachment的中间表,其中包含两个字段:
当我呼叫News.Attachments.Add(附件)时,在新闻实体上;它正确地在附件和附件中添加记录。新闻附件表。
当我从News.Attachments中删除一些列表项时,它正确地从NewsAttachment表中删除记录,但它不会删除FileAttachment表中的记录。我也想删除它。
有人可以建议更好的Fluent API配置来实现这一目标吗?
谢谢, 阿米特
修改
在我的情况下,FileAttachment存储用于各种目的的文件。我也有博客实体也有附件。那么,两个中间表BlogAttachments&amp; FileAttachments。现在,如果我使用WithOptional(我不能使用WithRequired,因为我需要在FileAttachment表中使用BlogId&amp; NewsId),我可以摆脱中间表,但仍然删除不会从FileAttachment表中删除记录,它只是使NewsId / BlogId为NULL。
有什么建议吗?主要的是我不想用FileAttachment表中的所有字段创建单独的表。
答案 0 :(得分:0)
这是预期的 - 因为它创建了多对多和额外的表 - 级联仅适用于该表。
News
和Attachment
之间没有直接的'FK'关系News
,因为它通过连接表。因此你不能期望例如要删除的附件,如果新闻有 - 因为附件可能有与之相关的其他新闻。
另见这一点 - 它有点相关。
One to Many Relationship with Join Table using EF Code First
即。如果你的结构允许没有明确地创建多对多(不要在两边放置集合,或者在流畅的配置中使用类似的集合)。
在您的情况下提供“附件”不能在News
之间重复使用 - 然后只需在attach...
中添加一个集合导航属性 - 并保留附件没有任何 - 或者如果你需要的话,从附件(如'父')创建一个'FK'单例导航。
另一方面,如果
news
可能是不同的父级modelBuilder.Entity<News>() .HasMany(c => c.Attachments) .WithOptional() // or WithRequired (test to see which is better for you) .WillCascadeOnDelete(true);
记录 - 然后你不应该有级联删除。
注意:检查生成的迁移脚本 - 或SQL / Db - 以确切了解它创建的内容 - 并确保没有创建中间表 - 并且只有一个'FK'来自'附件'到'新闻'。
编辑
public ICollection<FileAttachment> Attachments {get;set;}
...并在新闻中制作一个{{1}} (实际上,集合属性就是你所需要的 - 但配置是安全的,你得到你想要的东西)
这会让你成为一对多(或多对一),这是你数据的本质(正如你在评论中所说的那样) - 你可以进行级联删除。