2010-03-19 65 views
15

我有一个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 
) 

回答

24

我刚刚处理了这个确切的问题。事实证明,当我使用EF到Update model from database...选项时,它没有正确地获得关于删除的“级联”规则。

尝试进入EF数据库模型,单击导致问题的关联,然后确保End1 OnDelete(可能是End2,取决于数据库方案)设置为Cascade

+0

有没有办法解决你是否应该更新End1或End2?或者它只是试验和错误? – 2011-10-28 10:55:11

+1

这取决于你的数据库建模的方式。如果你有一对多的关系,'一个'端应该被设置为'Cascade' – Omar 2011-10-28 14:08:28

1

听起来像是一个供应商的bug。级联应该从数据库中提取。用SQL Server尝试一下;你会看到它在那里工作。你应该向编写你的SQLite提供者的人报告。

+0

我可以验证它不是(仅)SQLite提供程序错误。除非您删除整个模型并重新创建,否则添加级联不会反映到SQL Server中的模型中。疼痛。 – Andiih 2011-01-21 22:11:27

+0

@Andiih,只有当实体在没有它们的情况下(大概是不正确的)首先被添加了。设计人员不会覆盖您的自定义CSDL。这实际上是一个功能。 – 2011-01-22 01:57:47

+0

是的,我搞乱了数据库设计。我没有定制CSDL。有没有办法强制刷新而不删除并重新添加整个模型? – Andiih 2011-01-22 12:00:12

4

我遇到了与SQL Server相同的问题。当我尝试从数据库更新模式时,它没有选择级联规则。请注意,规则是​​在模型创建完成后添加的。我甚至尝试从模型中删除一个表格并将其添加回来。这具有相同的效果 - 没有级联规则。

但是,当我使用相同的确切表创建了一个全新的模型时,它采用了级联规则。所以我的解决方案只是删除旧的模型,并创建一个新的相同的名称,等等。

我想是从数据库进程更新模型有问题。

+1

我有这个问题与Sql服务器 – 2011-01-05 18:09:30

+1

我也可以确认相同的问题 – Andiih 2011-01-21 22:11:44

+0

设计师将永远不会覆盖现有的CSDL。因为您通常希望保留自定义设置。在这种情况下,你不这样做,但那不是常见的情况。 – 2011-01-22 01:58:45

0

只能使用导航属性而不使用外键属性。删除级联不能解决代码中的问题,因为您的人员对象不会被标记为已删除。