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

在外键上我设置了级联删除.现在,当我删除Folder表中的记录时,只删除FolderItem中的相关记录.
这是预期和正确的.
我要完成的是当我删除Folder表中的记录时,应该删除FolderItem和Item表中的相应记录.
我该如何解决这个问题?通过添加一个触发器来删除有问题的FolderID的所有Item实例?或者有更好的解决方案吗?
在不暴露外键的情况下执行一对多关系的删除时,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中启用级联删除而不在关系的多方面暴露外键?
是否可以自动预测DELETE CASCADE后面的操作?在我的软件中,我想向用户发出警告,其中包含有关将被删除的数据的详细信息.
我在删除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)
但是,我得到错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
我没有关于如何删除这些对象的想法.有任何想法吗?
我正在使用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) 如堆栈溢出答案所示,在Waterline中不支持级联(特别是级联删除),通过使用(或用于软删除)生命周期回调并删除相关记录,可以解决一对多关联问题.第二个查询.这可以通过内部实现.afterDestroyafterUpdateManyModel.destroy({ oneModel: _.pluck(destroyedOneModels, "id") })afterDestroy
我们如何为多对多关系做到这一点(考虑到内部使用联结表,我们必须从中删除记录)?
使用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) 我已经阅读了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时正常工作,但是,如果删除User或Team删除会发生什么?
即.如果User被删除,在行UserPlaylist会被删除,但被引用的行中Playlist,并PlaylistVideo仍将保留.我考虑过强制执行此操作,TRIGGER AFTER DELETE但无法知道删除请求是否因为Playlist已删除或删除而导致User.
在这种情况下,强制执行诚信的最佳方法是什么?
编辑(提供ERD)

mysql referential-integrity single-table-inheritance polymorphic-associations cascading-deletes
假设我们有两个实体,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查询然后继续愉快.对此有什么"最佳实践"吗?
尝试使用删除级联和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)
?
mysql ×2
.net ×1
c# ×1
code-first ×1
eclipselink ×1
eloquent ×1
foreign-keys ×1
hibernate ×1
java ×1
jpa ×1
jpa-2.0 ×1
laravel ×1
laravel-4 ×1
one-to-many ×1
sails.js ×1
sql ×1
sql-server ×1
waterline ×1