简而言之,EF默认是删除级联。我有一个由Devart使用Entity Developer设置的父/子关系。它被设置为删除级联。父表如下所示:
CREATE TABLE `Tools` (
`ToolNumber` TEXT,
`ToolID` INTEGER PRIMARY KEY AUTOINCREMENT
);
子表具有以下定义:
CREATE TABLE `FirstParts` (
`FirstPartID` INTEGER PRIMARY KEY AUTOINCREMENT,
`DateTime` TEXT,
`ToolID` INT32 NOT NULL,
CONSTRAINT `FK_FirstParts_Tools` FOREIGN KEY(`ToolID`) REFERENCES
`Tools`(`ToolID`) ON DELETE CASCADE
);
我可以使用以下代码将记录添加到父/子。当我使用它时,我会在每个表中获得一条记录,并正确设置ToolID。
using (var context = new Entities())
{
var query = from t in context.Tools
where t.ToolNumber == "Hello"
select t;
if (!query.Any())
{
var tool = new Tool()
{
ToolNumber = "Hello",
FirstParts = new System.Data.Entity.Core.Objects.DataClasses.EntityCollection<FirstPart>() { new FirstPart() { DateTime = "Same text" } }
};
context.AddToTools(tool);
context.SaveChanges();
}
}
当我使用以下内容删除父级时,孩子将被挂起:
using (var context = new Entities())
{
var query = (from t in context.Tools
select t).FirstOrDefault();
if (query != null)
{
context.Tools.DeleteObject(query);
context.SaveChanges();
}
}
如果我使用SQLite浏览器并执行以下SQL,那么父和子都会被正确删除所以我知道它不是SQLite。
DELETE FROM Tools WHERE Tools.ToolID = 6;
我已查找以下内容以确保Cascade删除未被覆盖:
OnModelCreating(false)
它不存在于Entity Developer创建的代码中。
什么可能导致EF不级联删除?