流畅的关系配置

时间:2014-09-13 22:02:52

标签: c# entity-framework

在我的模型中,我有一些实体引用了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; }

}

enter image description here

我要做的是通过删除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);
    }

1 个答案:

答案 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具有NewsArticlesStaffs集合属性,则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也会删除引用当前已删除图片的所有NewsArticleStaff