标签: cascading-deletes

如何级联删除多对多表

我有一个3个表,看起来像这样:

在外键上我设置了级联删除.现在,当我删除Folder表中的记录时,只删除FolderItem中的相关记录.

这是预期和正确的.

我要完成的是当我删除Folder表中的记录时,应该删除FolderItem和Item表中的相应记录.

我该如何解决这个问题?通过添加一个触发器来删除有问题的FolderID的所有Item实例?或者有更好的解决方案吗?

sql-server cascading-deletes

14
推荐指数
1
解决办法
1万
查看次数

在EF Code First中启用级联删除而不暴露外键

在不暴露外键的情况下执行一对多关系的删除时,EF会删除父记录并尝试使子记录上的外键为空.这当然会导致错误,因为外键不可为空.将外键添加到子类会覆盖此行为,但我宁愿不公开它.

例如,给定以下两个类,我不希望将JobId作为Project类的属性.

public class Job : ModelBase
{
    [Required]
    [StringLength(100)]
    public string Company { get; set; }

    [Required]
    [StringLength(100)]
    public string JobTitle { get; set; }

    public ICollection<Project> Projects { get; set; }
}

public class Project : ModelBase
{
    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    [Required]
    public string Summary { get; set; }

    public int JobId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在EF Code First中启用级联删除而不在关系的多方面暴露外键?

entity-framework one-to-many code-first cascading-deletes

14
推荐指数
1
解决办法
8068
查看次数

在MySQL中模拟DELETE CASCADE?

是否可以自动预测DELETE CASCADE后面的操作?在我的软件中,我想向用户发出警告,其中包含有关将被删除的数据的详细信息.

mysql cascading-deletes

14
推荐指数
1
解决办法
1312
查看次数

删除级联的实体框架

我在删除Entity Framework 4.1中的相关行时遇到问题.我有关系表

书1 <--->*BookFormats

我已经设置了删除级联:

ALTER TABLE [dbo].[BookFormats]  WITH CHECK ADD  CONSTRAINT [FK_BookFormats_Book] 
FOREIGN KEY([BookID]) REFERENCES [dbo].[Book] ([BookID]) on delete cascade
Run Code Online (Sandbox Code Playgroud)

EDMX属性

在此输入图像描述

然后,我想删除BokFormats与我的Book对象相关的所有项目:

 var originalBook = m.db.Book.First(x => x.BookID == bookId);
 originalBook.BookFormats.Clear();
 m.db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

但是,我得到错误:

操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.

我没有关于如何删除这些对象的想法.有任何想法吗?

c# entity-framework foreign-keys cascading-deletes

14
推荐指数
2
解决办法
5万
查看次数

在Hibernate中删除级联多个对象的最快方法

我正在使用Hibernate删除一个具有两个级联级别的对象,我的问题是当我查询对象然后删除时它非常慢,我有兴趣看看是否有更快的方法.我的代码,删除15个Statement对象大约需要15-30秒,如下所示:

public void deleteStatement(Long batchId) {
    List<Statement> statements = session.createQuery("from Statement where batchId = ?").setParameter(0, batchId).list();
    for(Statement statement : statements) {
        session.delete(statement);
        logger.debug("Deleted statement");
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

session.createQuery("delete from Statement where batchId = ?").setParameter(0, batchId).executeUpdate();
Run Code Online (Sandbox Code Playgroud)

但问题是这种方法不会发生删除级联.是否有一种有效的方法来删除我的对象并仍然发生级联,或者有什么我做错了?

谢谢您的帮助!

更新
响应davidfrancis,这里是hibernate生成的SQL的解释.这很疯狂,成千上万行,信不信由你!注意,我的域对象Statement包含Invoice集,其中包含Transaction集.我懒得加载我的所有收藏品,顺便说一下.首先有很多数据检索,我认为这与HQL选择查询有关:

org.hibernate.hql.ast.QueryTranslatorImpl - HQL: from com.myapp.domain.cc.Statement where batchId = ?
org.hibernate.hql.ast.QueryTranslatorImpl - SQL: select statement0_.id as id2_, statement0_.batchId as batchId2_ from statement statement0_ where batchId=?
org.hibernate.loader.Loader - result row: EntityKey[com.myapp.domain.cc.Statement#393]
org.hibernate.loader.Loader - result row: EntityKey[com.myapp.domain.cc.Statement#394]
...
org.hibernate.SQL - select invoices0_.statementId …
Run Code Online (Sandbox Code Playgroud)

java hibernate cascading-deletes

14
推荐指数
1
解决办法
8180
查看次数

Sails.js/Waterline级联删除多对多关联

堆栈溢出答案所示,在Waterline中不支持级联(特别是级联删除),通过使用(或用于软删除)生命周期回调并删除相关记录,可以解决一对多关联问题.第二个查询.这可以通过内部实现.afterDestroyafterUpdateManyModel.destroy({ oneModel: _.pluck(destroyedOneModels, "id") })afterDestroy

我们如何为多对多关系做到这一点(考虑到内部使用联结表,我们必须从中删除记录)?

cascading-deletes sails.js waterline

14
推荐指数
1
解决办法
3594
查看次数

循环删除以哪种方式进行一对多关系?

使用Entity Framework代码优先方法.

假设我有两个实体类:

[Table("Objects")]
public class DbObject : IValidatableObject
{
    public long Id { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<DbObjectProperty> Properties { get; set; }
}

[Table("ObjectProperties")]
public class DbObjectProperty
{
    public long Id { get; set; }

    public string Name { get; set; }
    public string Value { get; set; }

    [Display(Name = "Object"), UIHint("Object")]
    public long ObjectId { get; set; }
    public virtual DbObject …
Run Code Online (Sandbox Code Playgroud)

.net entity-framework cascading-deletes

13
推荐指数
1
解决办法
1705
查看次数

如何在单表继承上强制引用完整性?

我已经阅读了Bill Karwin关于单表继承的一些答案,并认为这种方法对我正在考虑的设置有好处:

Playlist
--------
id AUTO_INCREMENT
title

TeamPlaylist
------------
id REFERENCES Playlist.id
teamId REFERENCES Team.id

UserPlaylist
------------
id REFERENCES Playlist.id
userId REFERENCES User.id

PlaylistVideo
-------------
id
playlistId REFERENCES Playlist.id
videoId REFERENCES Video.id
Run Code Online (Sandbox Code Playgroud)

所有CASCADE选项都设置DELETE为在Playlist删除a时正常工作,但是,如果删除UserTeam删除会发生什么?

即.如果User被删除,在行UserPlaylist会被删除,但被引用的行中Playlist,并PlaylistVideo仍将保留.我考虑过强制执行此操作,TRIGGER AFTER DELETE但无法知道删除请求是否因为Playlist已删除或删除而导致User.

在这种情况下,强制执行诚信的最佳方法是什么?

编辑(提供ERD)

在此输入图像描述

mysql referential-integrity single-table-inheritance polymorphic-associations cascading-deletes

13
推荐指数
2
解决办法
2469
查看次数

我应该让JPA或数据库级联删除吗?

假设我们有两个实体,A和B. B与A有多对一的关系如下:

@Entity
public class A {
  @OneToMany(mappedBy="a_id")
  private List<B> children;
}

@Entity
public class B {
  private String data;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想删除A对象并将删除级联到其所有子对象(B).有两种方法可以做到这一点:

1)添加cascade=CascadeType.ALL, orphanRemoval=true到OneToMany注释,让JPA在从数据库中删除A对象之前删除所有子项.

2)按原样保留类,只需让数据库级联删除即可.

使用后面的选项有什么问题吗?它会导致实体管理器保留对已删除对象的引用吗?我选择第二个选项的原因是选项一生成n + 1个SQL查询以进行删除,当对象A包含大量子节点时可能需要较长时间,而选项二只生成一个SQL查询然后继续愉快.对此有什么"最佳实践"吗?

sql jpa eclipselink cascading-deletes jpa-2.0

12
推荐指数
3
解决办法
5343
查看次数

如何在Laravel4中级联软件?

尝试使用删除级联和softDeletes的外键没有太多运气.

我有2个表:用户,事件.两个表都有softDeletes.

用户可以拥有0..n个活动.
事件有一个user_id,用作用户的外键,如下所示:

$table->foreign('user_id')->references('id')->on('users')->onDelete('CASCADE')->onUpdate('CASCADE');
Run Code Online (Sandbox Code Playgroud)

问题是,当我删除用户时,它会被软删除,但其事件不会 - 软删除或物理删除.

我做错了什么,或者这是正确的雄辩行为?

其次,如果这是正确的行为,如何最好地实现删除级联?也许覆盖我的模型中的delete()方法,就像这样......

public function delete()
{
  //delete all events...
  __parent::delete()
}
Run Code Online (Sandbox Code Playgroud)

cascading-deletes laravel eloquent laravel-4

12
推荐指数
1
解决办法
5597
查看次数