【问题标题】:Entity Framework not cascade deleting实体框架不级联删除
【发布时间】:2019-02-21 01:03:44
【问题描述】:

简而言之,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;

我已查找以下内容以确保级联删除不会被覆盖:

OnModelCreating(false)

它不存在于 Entity Developer 创建的代码中。

什么可能导致 EF 不能级联删除?

【问题讨论】:

  • When I use the following to delete the parent the child is left hanging:- child is left hanging 在这里是什么意思?它是否只删除了保持孩子完好无损的父母?正确解释删除父级时的场景。
  • 你能告诉我们一些关于你的模型绑定的代码吗?
  • @TanvilArjel - 父级被删除,表中的子级没有父级。
  • @noobed - 我很乐意。代码由Entity Developer自动生成,大约500行,这么多代码怎么发?
  • @noobed - 这是一个过去的垃圾箱。 pastebin.com/q080bYrs

标签: c# entity-framework-6 devart


【解决方案1】:

请添加“外键约束=打开;”到您的连接字符串以解决问题。参考https://www.devart.com/dotconnect/sqlite/docs/?Devart.Data.SQLite~Devart.Data.SQLite.SQLiteConnection~ConnectionString.html

【讨论】:

  • 谢谢。我在三个不同的地方找到了连接字符串。 1) 下的 DataModel.edps 2) 在公共 Entities() 的 DataModel1.Designer.cs 中 3) 在 app.config 中。我的模型未设置为使用应用程序配置,因此我删除了该连接字符串。我添加了“外键约束=打开;”到两个连接字符串,它被忽略了。当我从子表中删除最后一个子表时,父表中的记录仍未删除。
猜你喜欢
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多