将Entity Framework 6与 Designer 一起使用,我们所有的实体都有一个 independent association 。因此,我们的模型属性中没有定义外键。
让以下实体具有一对多关系:
import threading
import time
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QFormLayout
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QTabWidget
from PyQt5.QtWidgets import QTextEdit
from PyQt5.QtWidgets import QWidget
class ATry(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
time.sleep(1)
anotherTextEdit = QTextEdit()
anotherLineEdit = QLineEdit()
anotherLayout = QFormLayout()
anotherLayout.addRow(anotherTextEdit)
anotherLayout.addRow(anotherLineEdit)
anotherTab = QWidget()
anotherTab.setLayout(anotherLayout)
md.addTab(anotherTab, "Outside")
app = QApplication(sys.argv)
md = QTabWidget()
aTextEdit = QTextEdit()
aLineEdit = QLineEdit()
layout = QFormLayout()
layout.addRow(aTextEdit)
layout.addRow(aLineEdit)
thisTab = QWidget()
thisTab.setLayout(layout)
md.addTab(thisTab, "Inside")
a = ATry()
a.start()
md.show()
app.exec_()
映射到以下SQL表:
public class Parent
{
public Guid Id { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
public Guid Id { get; set; }
public virtual Parent Parent { get; set; }
}
正如您所看到的,我们没有使用CREATE TABLE Parent (
Id uniqueidentifier NOT NULL,
CONSTRAINT PK_Parent PRIMARY KEY CLUSTERED (Id)
)
CREATE TABLE Child (
Id uniqueidentifier NOT NULL,
FkParent uniqueidentifier NOT NULL,
CONSTRAINT PK_Child PRIMARY KEY CLUSTERED (Id)
)
ALTER TABLE Child WITH CHECK
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY(FkParent) REFERENCES Parent ([Id])
ALTER TABLE Child CHECK CONSTRAINT FK_Child_Parent
,因为我的团队反对使用它。
所以问题是,删除父母的正确方法是什么?只有父母的CASCADE ON DELETE
才能删除父母的子女?
使用 delete ,我的意思是在调用Id
后,应删除两个表中的SQL记录(产生DELETE
SQL语句)。
答案 0 :(得分:0)
所以我想出如何实现这一目标的唯一方法是通过显式将子项加载到内存中并在实际删除父项之前逐个删除它们。
using (var context = new MyDbContext())
{
var parent = context.Parents.Find(parentId);
//or use LINQ if you prefer:
var alternative = context.Parents.Single(p => p.Id == parentId)
foreach(var child in parent.Children.ToList())
{
context.Children.Remove(child);
}
context.Parents.Remove(parent);
context.SaveChanges();
}
注意.ToList()
(或.ToArray()
,如果您愿意)Children
重要,如this answer中所述。
性能方面这不太理想,因为你必须从数据库中查询每个子记录并将其加载到内存中(我想对于一个小应用程序,这无关紧要)。但是,如果不使用CASCADE ON DELETE
,我找不到更好的方法,即使我不确定这是否真的会胜过这种情况。