在我的应用程序中,该界面允许用户在实体框架模型中创建和删除实体。所有更改都添加到 中ObjectContext
,并且仅在用户选择“保存”时才保存。
我的问题最好通过以下简单示例提出:
我在两个实体类型之间有一个外键关系,我将在这里调用Parent
它Child
。在 SQLite 中,数据库声明如下:
CREATE TABLE Parents (ID INTEGER PRIMARY KEY);
CREATE TABLE Children
(
ID INTEGER PRIMARY KEY,
ParentID INTEGER NOT NULL
CONSTRAINT FK_ChildrenToParents REFERENCES [Parents](ID)
ON DELETE CASCADE ON UPDATE CASCADE
)
然后我在该数据库上构建一个实体框架模型,并对它执行以下操作(参见下面的代码):
- 创建一个
Parent
- 节省
- 删除
Parent
- 创建一个
Parent
与原始 ID 号相同的新 - 创建一个
Child
并为其提供新Parent
的 ID 号 - 保存(失败)
demoDBEntities entities = new demoDBEntities();
Parent originalParent = new Parent { ID = 1 };
entities.Parents.AddObject(originalParent);
entities.SaveChanges(); // First Save
entities.Parents.DeleteObject(originalParent);
Parent newParent = new Parent { ID = 1 };
entities.Parents.AddObject(newParent);
Child newChild = new Child { ID = 2, ParentID = 1 };
entities.Children.AddObject(newChild);
entities.SaveChanges(); // Second Save
我在第二次调用时收到以下错误SaveChanges()
:
"Unable to insert or update an entity because the principal end of the 'demoDBModel.FK_Children_0_0' relationship is deleted."
似乎问题在于实体框架将新Child
项目链接到originalParent
项目,然后将其删除并被newParent
项目替换。这可能听起来很自负,但在我的应用程序中很自然地发生。
我有什么办法可以解决这个问题吗?
PS:我知道重复使用数据库条目的 ID 号是不好的做法 - 但是,在我的情况下,ID 号是资产号,理论上可以重复使用。也就是说,如果客户端创建了一个 faulty Parent
,然后删除它,重新创建它,然后创建Child
项目,则通常会发生上述情况。