我有两个双向一对多关系的实体:
public class Storage
{
public IList<Box> Boxes { get; set; }
}
public class Box
{
public Storage CurrentStorage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和映射:
<class name="Storage">
<bag name="Boxes" cascade="all-delete-orphan" inverse="true">
<key column="Storage_Id" />
<one-to-many class="Box" />
</bag>
</class>
<class name="Box">
<many-to-one name="CurrentStorage" column="Storage_Id" />
</class>
Run Code Online (Sandbox Code Playgroud)
A Storage可以有很多Boxes,但Box只能属于一个Storage.我将它们映射,以便一对多有一个级联all-delete-orphan.
当我尝试更换Box时,我的问题就出现了Storage.假设我已经运行了这段代码:
var storage1 = new Storage();
var storage2 = new Storage();
storage1.Boxes.Add(new Box());
Session.Create(storage1);
Session.Create(storage2);
Run Code Online (Sandbox Code Playgroud)
以下代码将给我一个例外:
// get the first …Run Code Online (Sandbox Code Playgroud) 我想删除具有许多用户组的用户,但这些用户组不属于该用户:其他用户也可以使用此用户组.即使没有用户引用用户组,也可以存在用户组.
我想映射多对多关系,这样如果用户被删除,关系会自动删除但不是用户组?
我试过,Cascade.All因为我认为多对多的级联会影响关系但不会影响另一方.我以为只会Cascade.AllDeleteOrphan删除其他人.显然我错了.
似乎我不理解级联规则.有人可以向我提供明确的解释,也许也可以达到我的目标吗?
谢谢
假设我有两个下表:
CREATE TABLE post (
id bigint(20) NOT NULL AUTO_INCREMENT,
text text ,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1;
CREATE TABLE post_path (
ancestorid bigint(20) NOT NULL DEFAULT '0',
descendantid bigint(20) NOT NULL DEFAULT '0',
length int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (ancestorid,descendantid),
KEY descendantid (descendantid),
CONSTRAINT f_post_path_ibfk_1
FOREIGN KEY (ancestorid) REFERENCES post (id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT f_post_path_ibfk_2
FOREIGN KEY (descendantid) REFERENCES post (id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
并插入这些行:
INSERT INTO …Run Code Online (Sandbox Code Playgroud) 这是我的情况:
public abstract class Article
{
[key]
public Guid Guid { get; set;}
public string Name { get; set;}
.
.
.
}
public class Download : Article
{
...
}
public abstract class Category : Article
{
...
}
public class DownloadCategory : Category
{
....
}
Run Code Online (Sandbox Code Playgroud)
然后我应该在下载之间有一个多对多的关系,DownloadCategory就像这样:
public class DownloadInCategory
{
[Key, Column(Order = 1), Required]
[ForeignKey("Download")]
Public Guid DownloadGuid { get; set; }
Public Download Download { get; set; }
[Key, Column(Order = 2), Required] …Run Code Online (Sandbox Code Playgroud) 我正在尝试决定如何最好地设置(如果有的话)我的rails应用程序的外键约束.我有一个模型Response,belongs_to一个Prompt.我想使用:dependent => :destroy每个Response属于删除的每个调用destroy Prompt,我试图决定我应该在我的外键上放置什么删除约束.
简而言之,我想要了解如何最好地利用依赖对象的destroy方法和外键约束,以确保cruft不会累积并反映存储数据的逻辑结构.几个早期的问题,比如我应该使用ON DELETE CASCADE,:dependent =>:destroy,还是两者都有?和Rails:删除cascade vs dependent destroy询问哪个更好但是他们并没有真正说明两个选择如何相互作用以及它们被触发的顺序或者看起来模糊不清.
正如我所看到的那样,考虑因素似乎分为几个方面:
:dependent => :destroy在从数据库中删除父对象之前,调用是否首先在依赖对象上进行销毁,因此即使我使用级联删除,仍会在这些对象上调用destroy?是否:dependent => :destroy从数据库中移除父项之前(或在事务中)从数据库中删除依赖对象?换句话说,如果我将cascade设置为nullify,数据库最终会在删除子对象之前浪费地取消它们的引用吗?
是否由于原始销毁和链接:dependent => :destroy选项包含在事务中而发出删除,或者遗憾的是,如果我没有设置级联删除,则会在数据库中暂时崩溃?
:dependent => :destroy如果我使用restrict作为外键on_delete选项,最后将确保从数据库中删除父对象?MongoDB中是否有一种方法可以使用具有"ON DELETE CASCADE"功能的外键?
我知道你可以使用DBRef作为一种外键,但是当删除引用指向的集合中的项时,引用返回null.但我希望删除引用所属的项目.我该怎么做呢?
或者每次我删除的东西都需要检查对它的引用?
我对EF很新,我有一点问题.
我只想删除数据库中的项目.我正在使用SQL Server 2012 Express,VS2012,AdventureWorks 2012.
我执行的查询如下:
context = new AWEntities();
var removedItem = context.Addresses
.Include("StateProvince")
.Include("SalesOrderHeaders")
.Include("BusinessEntityAddresses").Single(d => d.AddressID == 11);
context.Addresses.Remove(removedItem);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
DELETE语句与REFERENCE约束"FK_SalesOrderHeader_Address_ShipToAddressID"冲突.冲突发生在数据库"AdventureWorks2012",表"Sales.SalesOrderHeader",列"ShipToAddressID"中.该语句已终止.
这实际上是删除项目和其他表中相应条目的好方法吗?
请指出我正确的方向.
public partial class Address
{
public Address()
{
this.BusinessEntityAddresses = new HashSet<BusinessEntityAddress>();
this.SalesOrderHeaders = new HashSet<SalesOrderHeader>();
}
public int AddressID { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public int StateProvinceID { get; set; } …Run Code Online (Sandbox Code Playgroud) 我正在使用Momentics IDE(本机SDK)开发BlackBerry 10移动应用程序.
我有一个listview,我想用C++来处理它的项目(我需要使用C++而不是QML).
我可以使用"connect"指令获取索引路径,但是我将QVariant解析为自定义类有问题;
Q_ASSERT(QObject::connect(list1, SIGNAL(triggered(QVariantList)), this, SLOT(openSheet(QVariantList))));
QVariant selectItem = m_categoriesListDataModel->data(indexPath);
Run Code Online (Sandbox Code Playgroud)
我尝试使用如下的静态演员
Category* custType = static_cast<Category*>(selectItem);
Run Code Online (Sandbox Code Playgroud)
但它返回:
"invalid static_cast from type 'QVariant' to type 'Category*'"
Run Code Online (Sandbox Code Playgroud)
谁可以帮我这个事 ?
我有以下安排的课程:
class A {
static belongsTo = [c: C]
B b
}
class B {
static belongsTo = [c: C]
}
class C {
static hasMany = [bbs: B, aas: A]
}
Run Code Online (Sandbox Code Playgroud)
如果我现在创建这些类的实例...
B b = new B()
A a = new A()
a.b = b
C c = new C()
c.addToBbs(b)
c.addToAas(a)
Run Code Online (Sandbox Code Playgroud)
...并尝试保存c ...
c.save()
Run Code Online (Sandbox Code Playgroud)
......我得到了org.hibernate.TransientObjectException Message object references an unsaved transient instance - save the transient instance before flushing: B.
我认为GORM所做的是首先将保存级联c.aas,然后它会绊倒a.b尚未保存的实例.因此例外.
现在 …
我正在使用Rails 4.2.3和PostgreSQL数据库.我想写一个迁移来更新我的一个外键以具有on-delete级联约束,所以我创建了以下内容:
class UpdateForeignKeyAddOnDeleteConstraint < ActiveRecord::Migration
def change
remove_foreign_key :my_object_times, :my_objects
add_foreign_key :my_object_times, :my_objects, on_delete: cascade
end
end
Run Code Online (Sandbox Code Playgroud)
但是当我运行迁移时,我收到以下错误:
$ rake db:migrate
== 20160525203028 UpdateForeignKeyAddOnDeleteConstraint: migrating ============
-- remove_foreign_key(:my_object_times, :my_objects)
-> 0.0454s
-- cascade()
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
undefined local variable or method `cascade' for #<UpdateForeignKeyAddOnDeleteConstraint:0x007f82f2c71998>
/Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/migration.rb:664:in `block in method_missing'
/Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/migration.rb:634:in `block in say_with_time'
/Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/migration.rb:634:in `say_with_time'
/Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/migration.rb:654:in `method_missing'
Run Code Online (Sandbox Code Playgroud)
我该如何编写迁移来更新外键?
cascade ×10
foreign-keys ×5
nhibernate ×2
c# ×1
c++ ×1
constraints ×1
dbref ×1
grails ×1
grails-orm ×1
hibernate ×1
many-to-many ×1
migration ×1
mongodb ×1
mysql ×1
one-to-many ×1
qt ×1
qvariant ×1