在我的模型中,我有一些实体引用了Image类的实例
public class Image
{
public int ID { get; set; }
public string URL { get; set; }
}
public abstract class TeamBase
{
public Image Image { get; set; }
}
public class NewsArticle
{
public Image Image { get; set; }
}
我要做的是通过删除NewsArticles和其他实体来实现图像的删除级联
[Authorize]
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
NewsArticle newsArticle = _repository.Get((int)id);
_repository.Delete(newsArticle);
_repository.Save();
return RedirectToAction("Index");
}
那么在OnModelCreating的重写中,声明引用Image实例的每个实体的关系的正确选项是什么?以下方法是正确的选择吗?
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<NewsArticle>()
.HasOptional(n => n.Image)
.WithOptionalPrincipal()
.WillCascadeOnDelete(true);
modelBuilder.Entity<Staff>()
.HasOptional(n => n.Image)
.WithOptionalPrincipal()
.WillCascadeOnDelete(true);
}
答案 0 :(得分:2)
我认为只要WithOptionalPrincipal()
实体没有WithMany()
的集合,您就需要将Image
替换为NewsArticles
。
配置
modelBuilder.Entity<NewsArticle>()
.HasOptional(n => n.Image)
.WithMany() // no collection property on Image
.WillCascadeOnDelete(true);
modelBuilder.Entity<Staff>()
.HasOptional(n => n.Image)
.WithMany() // no collection property on Image
.WillCascadeOnDelete(true);
如果Image
具有NewsArticles
和Staffs
集合属性,则WithMany()
应提及WithMany(x => x.NewsArticles)
和WithMany(x => x.Staffs)
。
public class Image
{
public ICollection<NewsArticle> NewsArticles { get; set; }
public ICollection<Staff> Staffs { get; set; }
}
数据库中的NewsArticle
表将在数据库中生成Image_ID
列,因为您使用的是独立关联(NewsArticle上没有ImageID
属性)。
数据库中的Image
表将没有任何其他列。
删除Image
也会删除引用当前已删除图片的所有NewsArticle
或Staff
。