我一直在研究一个项目,我正试图让级联删除开始。我有一个模型,我用它来评论。这些注释可以包含调用注释类的回复。我要做的是让它删除所有可以从评论中流出的回复。
评论 - >回复 - >回复 - >回复 - >等等。
如果我朝错误的方向走,请告诉我。我试图对此进行研究,但我想出的只是一对一和一对多级联代码。我正在使用CodeFirst和MVC 4来构建我的项目。
被修改
public class Comment
{
// Properties
public long Id { get; set; }
[Required]
[StringLength(250, ErrorMessage = "{0} must be between {1} and {2} characters", MinimumLength = 2)]
public string Body { get; set; }
[Required]
public DateTime CreateDate { get; set; }
[Required]
[InverseProperty("Comments")]
public User Author { get; set; }
[InverseProperty("CommentCount")]
public Blog Blog { get; set; }
public bool Hidden { get; set; }
public long RepliesId { get; set; }
[InverseProperty("Replies")]
public virtual Comment Comments { get; set; }
[InverseProperty("Comments")]
public virtual ICollection<Comment> Replies { get; set; }
public virtual ICollection<Vote> Votes { get; set; }
public Comment()
{
CreateDate = DateTime.UtcNow;
Hidden = false;
}
}
这是我的DataContextInitializer
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Comment>().HasMany(i => i.Replies)
.WithOptional(i => i.Comments)
.HasForeignKey(i => i.RepliesId)
.WillCascadeOnDelete();
}
答案 0 :(得分:2)
你可以用这样的东西启用级联删除(即你需要手动设置关系)......
modelBuilder.Entity<Comment>()
.HasOptional(x => x.Replies)
.WithOptionalDependent()
.WillCascadeOnDelete(true);
然而,它对你没有多大帮助 - 因为Update-Database
会失败... ...
具有UPDATE或DELETE CASCADE规则的外键约束, 并且不允许在同一个表中自引用列。
即。适用于连接不同表格的FK-s - 但不适用于self-referencing
。
请参阅此帖子以及更多相关信息 - 尤其是提及的评论
“您需要删除FK并使用级联删除手动创建它 你的DatabaseInitializer“
EF4 Code first - delete all children when deleting parent from db?
简而言之,我认为没有直接的解决方案 - 但需要一些手动设置(初始化程序等)(我还没试过)。或者尝试重新组织,平衡关系(我没有想太多,只是抛出一些相当普遍的方法)。
<小时/> 仅供参考 - 即使我认为它不会让你到任何地方(见上文)......
public class Comment
{
// Properties
public long Id { get; set; }
//[Required]
//[StringLength(250, ErrorMessage = "{0} must be between {1} and {2} characters", MinimumLength = 2)]
public string Body { get; set; }
[Required]
public DateTime CreateDate { get; set; }
// [Required]
// [InverseProperty("Comments")]
public MyUser Author { get; set; }
// [InverseProperty("CommentCount")]
public Blog Blog { get; set; }
public bool Hidden { get; set; }
public virtual ICollection<Comment> Replies { get; set; }
public virtual ICollection<Vote> Votes { get; set; }
public Comment()
{
CreateDate = DateTime.UtcNow;
Hidden = false;
}
}
modelBuilder.Entity<Comment>()
.HasOptional(x => x.Replies)
.WithOptionalDependent()
.WillCascadeOnDelete(true);
如果你让它“不级联”,这应该可以正常工作。否则失败。