ASP.NET Codefirst关系

时间:2014-02-08 11:34:09

标签: asp.net-mvc ef-code-first code-first

我在codefirst中建立了这种关系,但它显示了此图像中显示的错误。我为您上传了我的模型,您可以从here [4kb]下载它。这个错误是什么?为什么会这样呢?我希望在posts表中包含所有类别。那是什么方式?谁可以帮忙?

enter image description here

有人告诉我出了什么问题?

1 个答案:

答案 0 :(得分:0)

按照惯例在实体框架中,删除实体将删除链接到该实体的任何内容。在你的情况下,这意味着删除cat1将删除引用cat 1的每个cat2,cat3和post。

出现问题的原因是您在帖子地图上指定了WillCascadeOnDelete(true),您还希望帖子自动触发删除cat1,cat2和cat3,帖子引用该帖子会导致部分或完全擦除数据库(帖子删除删除删除类别的帖子等的类别)。

要解决此问题,您需要从postMap中删除WillCascadeOnDelete(true)映射。

this.HasRequired(t => t.cat1)
    .WithMany(t => t.posts)
    .HasForeignKey(d => d.excat1);
this.HasRequired(t => t.cat2)
    .WithMany(t => t.posts)
    .HasForeignKey(d => d.excat2);
this.HasRequired(t => t.cat3)
    .WithMany(t => t.posts)
    .HasForeignKey(d => d.excat3);

您需要将WillCascadeOnDelete(false)添加到您的cat2Map和cat3Map的树上方的类别中。

cat2Map:

this.HasRequired(t => t.cat1)
    .WithMany(t => t.cat2s)
    .HasForeignKey(d => d.excat1)
    .WillCascadeOnDelete(false);

cat3Map:

this.HasRequired(t => t.cat1)
    .WithMany(t => t.cat3s)
    .HasForeignKey(d => d.excat1)
    .WillCascadeOnDelete(false); <-- Add this
this.HasRequired(t => t.cat2)
    .WithMany(t => t.cat3s)
    .HasForeignKey(d => d.excat2)
    .WillCascadeOnDelete(false); <-- Add this