我有一个设置的SQLite数据库,因此当我删除一个Person时,删除是级联的。当我手动删除一个Person(删除引用PersonID的所有记录)时,这样可以正常工作。但是当我使用Entity Framework删除Person时出现错误:
System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
我不明白为什么会这样。我的触发器设置为在删除被告知要删除的对象之前清理所有相关对象。
当我进入模型编辑器并检查关系的属性时,它显示OnDelete属性没有任何操作。为什么不通过从DB中提取它来正确设置?如果我将此值更改为Cascade,一切正常,但我宁愿不依赖于此手动更改,因为如果我从数据库刷新我的模型并且它会丢失它。
这是我的表格的重用SQL。
CREATE TABLE [SomeTable]
(
[SomeTableID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[PersonID] INTEGER NOT NULL REFERENCES [Person](PersonID) ON DELETE CASCADE
)
CREATE TABLE [Person]
(
[PersonID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
)
答案 0 :(得分:24)
我刚刚处理了这个问题。事实证明,当我使用EF Update model from database...
选项时,它没有正确地获得删除的“级联”规则。
尝试转到EF数据库模型,单击导致问题的关联,然后确保End1 OnDelete
(可能是End2,取决于数据库方案)设置为Cascade
。
答案 1 :(得分:4)
我遇到了与SQL Server相同的问题。当我尝试从数据库更新模式时,它没有获取级联规则。请注意,在创建模型后添加了规则。我甚至尝试从模型中删除一个表并将其重新添加。这具有相同的效果 - 没有级联规则。
但是,当我创建一个具有相同精确表的全新模型时,它会选择级联规则。所以我的解决方案只是删除旧模型并创建一个具有相同名称的新模型等。
我想是数据库进程中的更新模型有问题。
答案 2 :(得分:1)
听起来像是一个提供程序错误。级联应该从DB中获取。尝试使用SQL Server;你会看到它在那里工作。您应该向编写SQLite提供程序的人报告此事。
答案 3 :(得分:0)
您只能在不使用外键属性的情况下使用导航属性。删除级联不能解决代码中的问题,因为您的person对象不会被标记为已删除。