方案如下,
我有3个名为Parent的对象(我简化名称),父母的子女和孩子的
父母的孩子是父母的集合,孩子的孩子是孩子的集合.
映射如下(相关部分)
亲
<set name="parentset"
table="pc-table"
lazy="false"
fetch="subselect"
cascade="all-delete-orphan"
inverse="true">
<key column=FK_ID_PC" on-delete="cascade"/>
<one-to-many class="parentchild,parentchild-ns"/>
</set>
Run Code Online (Sandbox Code Playgroud)
父母的孩子
<set name="childset"
table="cc-table"
lazy="false"
fetch="subselect"
cascade="all-delete-orphan"
inverse="true">
<key column="FK_ID_CC" on-delete="cascade"/>
<one-to-many class="childschild,childschild-ns"/>
</set>
Run Code Online (Sandbox Code Playgroud)
我想要实现的是,当我删除父级时,会有一个级联删除一直到孩子的孩子.但目前发生的是这个.
(这纯粹用于映射测试目的)获取父实体(工作正常)
IQuery query = session.CreateQuery("from Parent where ID =" + ID);
IParent doc = query.UniqueResult<Parent>();
Run Code Online (Sandbox Code Playgroud)
现在删除部分
session.Delete(doc);
transaction.Commit();
Run Code Online (Sandbox Code Playgroud)
在使用级联和反向解决了"无法插入空值"错误后,我希望现在可以使用此代码删除所有内容,但只删除父项.
我错过了可能错过的映射中的某些内容吗?任何正确方向的提示都非常受欢迎!
迭戈,谢谢你的回答.(和解释)
我去除了on-delete="cascade",这是因为我喜欢在代码中尽可能多地控制而不是在数据库中.
下面发布的代码是(工作)结果.
亲
<set name="parentset"
table="pc-table"
cascade="all-delete-orphan"
inverse="true"
batch-size="5">
<key column=FK_ID_PC"/>
<one-to-many class="parentchild,parentchild-ns"/>
</set>
Run Code Online (Sandbox Code Playgroud)
父母的孩子
<set name="childset"
table="cc-table"
cascade="all-delete-orphan"
batch-size="5"
inverse="true"> …Run Code Online (Sandbox Code Playgroud) 当删除发挥作用时,我对OneToOneField的工作方式感到有些困惑.我能找到的唯一准权威信息来自django-developers上的这个帖子:
我不知道你是否发现了这个,但是删除工作是朝着一个方向发展的,但不是你想要的方向.例如,使用您在另一条消息中发布的模型:
Run Code Online (Sandbox Code Playgroud)class Place(models.Model): name = models.CharField(max_length = 100) class Restaurant(models.Model): place = models.OneToOneField(Place, primary_key=True)如果您创建了与其关联的地方和餐厅,则删除该餐厅将不会删除该地点(这是您在此处报告的问题),但删除该地点将删除该餐厅.
我有以下型号:
class Person(models.Model):
name = models.CharField(max_length=50)
# ... etc ...
user = models.OneToOneField(User, related_name="person", null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
它的成立这种方式让我可以轻松地访问person从User使用实例user.person.
但是,当我尝试删除User管理员中的记录时,自然它会向后传递到我的Person模型,正如线程所讨论的那样,显示了以下内容:
您确定要删除用户"JordanReiter2"吗?以下所有相关项目将被删除:
不用说,我也没有要删除的Person记录,或任何其后代!
我想我理解逻辑:因为Person记录中的OneToOne字段中有一个值,删除User记录会user_id在数据库的列中创建一个错误的引用.
通常,解决方案是切换OneToOne字段所在的位置.当然,这是不可能的,因为User对象几乎是由它设定的django.contrib.auth.
有没有办法防止删除级联,同时仍然有一个直接的方式来访问人user?是创建扩展版本的模型的唯一方法吗?Userdjango.contrib
我改变了模型名称,所以希望它现在更清晰了.基本上,有成千上万的人事记录.不是每个人都有登录,但如果他们这样做,他们只有一个登录.
我的数据库中有两个表:' 故事 '和' 投票 '.
该故事表包含有关物品(例如标题,正文,作者姓名等)的所有信息.该票表包含所有文章的所有选票.投票中有一个名为item_name的字段,其中包含投票的文章的ID.
简单地说,ITEM_NAME在票等于ID在故事(取决于哪个物品的用户投票).
问题是:如果文章被删除,我该如何自动删除投票表中与该文章相关的所有记录?
它可以在数据库中设置,因此不需要设置其他PHP查询吗?
这是我的数据库结构:
故事

票

我不确定我的问题的正确术语是什么,所以我只是解释一下我想做什么.我有一个有向图,在我删除一个节点后,我想要删除所有独立相关的节点.
这是一个例子:

比如说,我删除节点'11',我也希望删除节点'2'(在我自己的例子中,它们将是2以下的节点,现在也必须删除)因为它没有连接到主图了.注意,不应删除节点"9"或"10",因为节点"8"和"3"仍然连接到它们.
我正在使用python库networkx.我搜索了文档,但我不确定术语,所以我不确定这是什么.如果可能的话,我想使用库提供的函数,而不是通过图形创建我自己的递归(因为我的图非常大).
任何有关如何做到这一点的帮助或建议都会很棒.
谢谢!
在Tomcat Web应用程序上运行的Maven-Spring-Hibernate-MySql中,我正在使用hibernate ddl来生成MySQL5InnoDBDialect的数据库模式.
除了外键的级联选项之外,生成的模式很好.例如,我有这样的结构:
保存用户详细信息对象的用户对象,两者共享相同的密钥:
@Entity
@Table(name = "Users")
public class User implements Serializable {
private static final long serialVersionUID = -359364426541408141L;
/*--- Members ---*/
/**
* The unique generated ID of the entity.
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "User_Id")
protected long id;
@Getter
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user", optional = true)
protected UserDetails userDetails;
...
}
Run Code Online (Sandbox Code Playgroud)
而用户详细信息:
@Entity
@Table(name = "UserDetails")
public class UserDetails implements Serializable {
private static final long serialVersionUID = …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,post_delete信号被记录在特定模型中以及何时被删除。
class A(models.Model):
...
class B(models.Model):
a = models.ForeignKey('A')
class C(models.Model):
b = models.ForeignKey('B')
def log_delete(sender, instance, **kwargs):
logging
post_delete.connect(log_delete, sender = A)
post_delete.connect(log_delete, sender = C)
Run Code Online (Sandbox Code Playgroud)
当您删除 A 级联删除的实例时,会删除 B 和 C 实例。如何禁用 Django 级联删除子实例的信号?
寻找Entity Framework级联删除的一些帮助.我们最初有全局级联删除禁用
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
Run Code Online (Sandbox Code Playgroud)
我们现在想要重新启用它.但问题是,在创建迁移时,我们得到此错误"可能导致循环或多个级联路径".
使用流畅的API工作的解决方案创建..
modelBuilder.Entity<Campus>()
.HasRequired(c => c.Institution)
.WithMany()
.WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)
然而,由于InstitutionId无处不在,机构会导致多个问题.我想避免不得不通过每个选项并逐个忽略它们.是否可以停止对Institution表中所有关系的级联删除?
机构永远不会被删除,所以我们不介意是否没有级联删除.
谢谢
我试图根据第三个表ID删除两个从属表中的所有行.
表结构:
Transaction
-Transaction_ID (primary)
-Timestamp
Purchase
-Item_ID
-Transaction_ID
-Purchase_ID (primary)
Item
-Item_ID (primary)
-Client_ID
Run Code Online (Sandbox Code Playgroud)
我想从事务/购买中删除与项目中的Client_ID匹配的所有行.听起来很简单......即使我可以把我的新手包裹起来......
DELETE dbName.t FROM
dbName.Transaction t
JOIN
dbName.Purchase p
ON
p.Transaction_ID = t.Transaction_ID
JOIN
dbName.Item i
ON
p.Item_ID = i.Item_ID
WHERE
Client_ID = 1
Run Code Online (Sandbox Code Playgroud)
不...
我得到了这个错误foreign key constraint fails...- 我相信很多人并不感到惊讶.
Purchase使用t.Transaction_ID的问题是什么? - (因此,这个外键会失败)
或者该表中可能存在其他t.Transaction_ID相关数据(我还没有找到).
编辑: COMPLETE ERROR
Cannot delete or update a parent row: a foreign key constraint fails
(`ItemTracker_dbo/Purchase`, CONSTRAINT `FK_Purchase_Transaction`
FOREIGN KEY (`Transaction_ID`) REFERENCES `Transaction` (`Transaction_ID`)
ON DELETE NO ACTION ON …Run Code Online (Sandbox Code Playgroud) 这是一个关于实现这一目标的最佳实践的问题.
我有一个FileSystemWatcher应该通知我用户对文件和文件夹的更改.还观察了细分市场.在同一目录中,我的程序有时也会发生变化.我不希望FileSystemWatcher检测这些程序更改的事件.
我的第一个实现是一个列表,我可以添加预期的事件.当我收到文件系统事件时,我检查列表并忽略它,如果它在那里.这听起来不太健壮,但似乎有效.
现在我发现了真正的问题:
D:被观看了FileSystemWatcher.
我有两个这样的文件夹:D:\ folder1\folder2
现在我想用我的应用程序删除folder1(其中包含folder2).所以我把D:\ folder1放在我的删除列表中.然后我打电话给像Directory.Delete(@"D:\folder1", true).现在我注意到在异常中无法删除folder1(为什么有).我从列表中删除了删除条目,但是folder2已被删除,我得到了他的FileSystemEvent.所以我得到了D:\ folder1\folder2的FileSystem事件.我的程序现在认为用户已经删除了这个文件夹并且做错了.
我现在有一些想法:
1.)通过删除每个文件和每个文件夹来递归删除文件夹.有了这个,我得到每个子文件夹并提交一个自己的列表条目.我已经实现了它,但它非常非常慢.
2.)也许有更好的方法FileSystemWatcher来使我的列表过时的聪明的过滤器?
3.)如果可以删除所有内容,也许只能删除目录树.所以如果它失败了我仍然拥有一切,如果不是,一切都被删除.这对我来说似乎是最优雅的解决方案,但不知道这是否可行?
4.)是否可以通过我的软件专门锁定所有文件和文件夹?如果这样就可以了,应该可以用一个删除命令删除所有内容,或者像这样删除?
我也愿意接受其他解决方案.
编辑1以使其更清晰:
我只想"看到"文件夹上的用户操作.如果我在这里操作我的程序中的东西,我不想看到这个事件.
通过我的实现,如果文件夹被锁定且无法删除,我将获得子文件夹的事件.
用英语解释并不容易,因为我不是英语母语者;).
编辑2:
5.)也许可以过滤FileSystemWatcher定义过程中的所有事件?
我有很多关系:
产品有很多类别,类别有很多产品.
说我有
Shopping Category
Food Category
Product A - Shopping Category, Food Category
Product B - Shopping Category
Run Code Online (Sandbox Code Playgroud)
现在我删除Shopping Category.我希望Product A删除引用Shopping Category,我想Product B完全删除.
我最终会:
Product A - Food Category.
Run Code Online (Sandbox Code Playgroud)
我如何在nhibernate中执行此操作(我使用流利的nhibernate).
我尝试使用Cascade DeleteOrphan,AllDeleteOrphan但当我这样做并删除购物时,产品A和B都被删除了.
public class CategoryMapping : ClassMap<Category>
{
public CategoryMapping()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize();
HasManyToMany(x => x.Products).Cascade.DeleteOrphan();
}
}
public class ProductMapping : ClassMap<Product>
{
public ProductMapping()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize();
HasManyToMany(x …Run Code Online (Sandbox Code Playgroud) nhibernate many-to-many fluent-nhibernate nhibernate-cascade cascading-deletes
c# ×3
mysql ×3
cascade ×2
django ×2
nhibernate ×2
.net ×1
algorithm ×1
foreign-keys ×1
graph-theory ×1
hbm2ddl ×1
hibernate ×1
many-to-many ×1
networkx ×1
one-to-one ×1
php ×1