级联删除使用实体框架和System.Data.SQLite的问题
我有一个SQLite数据库设置,所以当我删除一个人删除级联。当我手动删除一个人(删除引用PersonID的所有记录)时,这工作正常。但是当我使用实体框架删除的人,我得到一个错误:级联删除使用实体框架和System.Data.SQLite的问题
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属性的操作。为什么从数据库中拉出它不正确?如果我将此值更改为级联,则一切正常,但我宁愿不要依赖此手动更改,因为如果从数据库刷新我的模型并且它丢失了该怎么办。
下面是我的表的relivent 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
)
我刚刚处理了这个确切的问题。事实证明,当我使用EF到Update model from database...
选项时,它没有正确地获得关于删除的“级联”规则。
尝试进入EF数据库模型,单击导致问题的关联,然后确保End1 OnDelete
(可能是End2,取决于数据库方案)设置为Cascade
。
听起来像是一个供应商的bug。级联应该从数据库中提取。用SQL Server尝试一下;你会看到它在那里工作。你应该向编写你的SQLite提供者的人报告。
我遇到了与SQL Server相同的问题。当我尝试从数据库更新模式时,它没有选择级联规则。请注意,规则是在模型创建完成后添加的。我甚至尝试从模型中删除一个表格并将其添加回来。这具有相同的效果 - 没有级联规则。
但是,当我使用相同的确切表创建了一个全新的模型时,它采用了级联规则。所以我的解决方案只是删除旧的模型,并创建一个新的相同的名称,等等。
我想是从数据库进程更新模型有问题。
我有这个问题与Sql服务器 – 2011-01-05 18:09:30
我也可以确认相同的问题 – Andiih 2011-01-21 22:11:44
设计师将永远不会覆盖现有的CSDL。因为您通常希望保留自定义设置。在这种情况下,你不这样做,但那不是常见的情况。 – 2011-01-22 01:58:45
只能使用导航属性而不使用外键属性。删除级联不能解决代码中的问题,因为您的人员对象不会被标记为已删除。
有没有办法解决你是否应该更新End1或End2?或者它只是试验和错误? – 2011-10-28 10:55:11
这取决于你的数据库建模的方式。如果你有一对多的关系,'一个'端应该被设置为'Cascade' – Omar 2011-10-28 14:08:28