2011-10-17 71 views
1

我有一个属性对象,我想从最新的资源库集合中删除它。或者我可以说在保存到数据库之前先将它分离。有一个Property表是主要的,历史和细节表通过共享PropertyId作为关键字与Property有关。当我从存储库中分离对象并尝试保存时,它会导致错误。实体框架中的SaveChanges插入语句外键错误

这样做。

Repository.Detach(P); 

错误出在

Repository.SaveChanges(); 

错误:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_History_Property".
The conflict occurred in database "database", table "dbo.Property", column 'PropertyId'.
The statement has been terminated.

回答

1

尝试删除其他表的记录是在删除记录之前引用您要删除的记录的主键。

例:

事务表

TransactionID DateOfTransaction CustomerID 
1    11/15/11   1 
2    11/15/11   2 
3    11/15/11   15 
4    11/15/11   3 

成交详情

TransactionDetailID TransactionID ItemID Quatity 
1     1    43  15 
2     1    32  2 
3     2    43  89 
4     4    32  12 

TransactionID这里是一个外键(主键与其它表)。之前,你可以删除事务表父记录,你必须先删除所有记录,为它的PrimaryKey的引用避免外键约束错误

例:

如果你想从数据库中删除事务1 ,您必须首先删除交易明细(交易明细1和2),然后才能允许您删除交易ID 1

+0

我们如何删除子对象。如果我正在尝试这样做,就像P.History和P.Detail那么它是空的,所以我可以删除它。 –

0

我想你的意思是使用之后

Repository.DeleteObject(P); 
ObjectContext.SaveChanges(); 

这当然假设您真的在使用一些支持DbContext模型的EntityFramework的更高版本。

在早期版本中,库修改可以在存储库级别或ObjectContext的水平通过执行类似

ObjectContext.DeleteObject(P); 

随后作出的

ObjectContext.SaveChanges(); 
+0

这会导致相同的问题,但它不会导致外键错误。该关系无法更改,因为一个或多个外键属性是不可空的。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性指定另一个非空值,或者必须删除不相关的对象。在System.Data.Objects.ObjectContext。SaveChanges(SaveOptions选项)在 –

+0

在存储库中删除它并不意味着它可以被正确删除。您还必须考虑引用表的主键的外键约束。 –