EF可选导航级联不删除

时间:2016-06-05 19:31:02

标签: c# asp.net-mvc entity-framework

我已经阅读了这篇有用的帖子Entity Framework .Remove() vs. .DeleteObject(),基本上就是这样说的:

  

如果关系是可选的,即从子级引用到数据库中的父级的外键允许NULL值,则此外部将设置为null,如果调用SaveChanges,则将为childEntity写入此NULL值数据库(即两者之间的关系被删除)。使用SQL UPDATE语句会发生这种情况。没有DELETE语句。

这是否意味着即使选项CascadeOnDelete,可选关系也不会被级联?我希望删除ImageFile时删除EditPendingApprovalSong子项,此时它只是将外部Id设置为null。

public class EditPendingApprovalSong
{
    public int Id { get; set; }
    ...
    public virtual ImageFile Image { get; set; }
}

public class ImageFile
{
    public int Id { get; set; }
    public string Name { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Entity<EditPendingApprovalSong>().HasOptional(x => x.Image).WithOptionalPrincipal().WillCascadeOnDelete(true);

     base.OnModelCreating(modelBuilder);
}

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Admin")]
public ActionResult RejectEdit(ApproveEditDto approveEditDto)
{
    ...
    var editPendingApprovalSong = _editPendingApprovalSongService.GetEditPendingApprovalSong(approveEditDto.Id);

    _editPendingApprovalSongService.Delete(editPendingApprovalSong);

    return RedirectToAction("Index");
}

//Delete method that service calls
public virtual void Delete(T entity)
{
    _context.Set<T>().Remove(entity);
    Save();
}

与我的其他关系,例如:

modelBuilder.Entity<EditPendingApprovalSong>().HasMany(x => x.BuyLinks).WithOptional().WillCascadeOnDelete(true);

这些工作正常并删除它们应该的子对象。我的问题是,我是否需要将其中一个导航更改为必需,以使其正确级联或我做其他错误?

EF正在生成的SQL语句,您可以看到它正在执行的Update语句不是我想要的:

exec sp_executesql N'UPDATE [dbo].[ImageFiles]
SET [EditPendingApprovalSong_Id] = NULL
WHERE (([Id] = @0) AND ([EditPendingApprovalSong_Id] = @1))
',N'@0 int,@1 int',@0=6,@1=4

exec sp_executesql N'DELETE [dbo].[EditPendingApprovalSongs]
WHERE ((([Id] = @0) AND ([Song_Id] = @1)) AND ([User_Id] = @2))',N'@0 int,@1 int,@2 nvarchar(128)',@0=4,@1=1,@2=N'd40b1bdc-c5e9-4c74-bacd-6e6723e188d5'

1 个答案:

答案 0 :(得分:0)

我使用其他课程进行了测试,但它确实有效(在发布之前应该更加彻底)。我正在通过父类添加EditPendingApprovalSong,但是当我删除这个类时,我并没有通过父类删除它。这就是为什么EntityFramework没有做​​我想做的事情。