我已经阅读了这篇有用的帖子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'
答案 0 :(得分:0)
我使用其他课程进行了测试,但它确实有效(在发布之前应该更加彻底)。我正在通过父类添加EditPendingApprovalSong,但是当我删除这个类时,我并没有通过父类删除它。这就是为什么EntityFramework没有做我想做的事情。